PAT(乙级)2019年春季考试 7-1 大美数 (15分)
7-1 大美数 (15分)
若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。
输入格式:
输入在第一行中给出正整数 K(≤),随后一行给出 K 个待检测的、不超过 1 的正整数。
输出格式:
对每个需要检测的数字,如果它是大美数就在一行中输出 Yes,否则输出 No。
输入样例:
3
18 29 40
输出样例:
Yes
No
Yes
代码讲解:这题很有意思,我第一眼以为要把约数都求出来,然后深度遍历。。
后来想想也不一定要用,四重循环也可以。。。但是怎么取约数是有讲究的。。
很多人习惯取约数,按照素数的循环来求,这可不行哦。。首先我们看题意。。
什么叫整除。。。例如a%b==0 叫a被b整除,换言之b整除a。。。
也就说题意要求我们把四个不同的约数之和对我们输入的整数取余。。
而不是反过来的,我看网上大多数都写错了。。。还有更重要的是,既然是
和对输入整数取余,那就可以覆盖n倍,n是可以大于一,意味着我们输入的
整数本身也可以是约数。。。这个不要忘记,
1 #include<stdio.h> 2 int main() 3 { 4 int n,m,i,j,count,k,o,p,flag; 5 scanf("%d",&n); 6 int a[200]; //约数个数,这个是怎么估计的呢是因为我们取根号乘2.。仔细想想你能想得明白。。。 7 for(i=0;i<n;i++) 8 { 9 count=0; 10 flag=0; 11 scanf("%d",&m); 12 for(j=1;j<=m;j++) 13 { 14 if(m%j==0) 15 { 16 a[count++]=j; 17 } 18 } 19 if(count<4) //约数都小于四个就肯定不是了。。我当时怕超时。。提前判断一点。。。 20 { 21 printf("No\n"); 22 continue; 23 } 24 for(j=0;j<count;j++) //四重循环帮助查询是否有四个不同的因子能被m整除。。 25 { 26 for(k=j+1;k<count;k++) 27 for(o=k+1;o<count;o++) 28 for(p=o+1;p<count;p++) 29 { 30 if((a[j]+a[k]+a[o]+a[p])%m==0) 31 { 32 flag=1; 33 goto out; //为了方便使用了goto,你也可以一个一个break跳出,一样的 34 } 35 } 36 } 37 out: 38 if(!flag) 39 printf("No\n"); 40 else 41 printf("Yes\n"); 42 43 } 44 45 return 0; 46 }

浙公网安备 33010602011771号