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 }

 

 
posted @ 2020-11-26 22:55  罪梦者  阅读(349)  评论(0)    收藏  举报