2019春季考试 7-1 大美数

7-1 大美数 (15 分)

若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。

输入格式:

输入在第一行中给出正整数 K(10),随后一行给出 K 个待检测的、不超过 10​的4次方​​ 的正整数。

输出格式:

对每个需要检测的数字,如果它是大美数就在一行中输出 Yes,否则输出 No

输入样例:

  3
  18 29 40

输出样例:

    Yes

    No

         Yes


  题目分析:

   因为要判断的值m不超过1000,其正因数个数必然少于2*根号1000,所以建立一个数组来存储其正因数。

   然后用四重循环计算其和,判断和是否是m的正因数即可。

  解法知识点:

   四重循环、函数。

  

 

#include<cstdio>
#include<cmath> 
int isBeautiful(int m){
    int b[70];
    int temp=0;				//如果是大美数字,则为1,否则为0. 
    int j=0;
    for(int i=1;i<=sqrt(m);i++){
          if(m%i==0){
              b[j]=i;
              b[++j]=m/i;
              j++;
          }
    }
      //作用如下,但节省了循环次数。 
      /*for(int i=1;i<=m;i++){
          if(m%i==0){
              b[j]=i;
              j++;
          }
      } */
      //j是数组的长度,遍历输入m的正因数。 
   
   
    for(int w=0;w<j-3;w++){
          for(int x=w+1;x<j-2;x++){
              for(int y=w+2;y<j-1;y++){
                  for(int z=w+3;z<j;z++){
                      int sum=b[w]+b[x]+b[y]+b[z];
                      if(m%sum==0)temp=1;
                  }
              }
          }
    }				//四重循环秘技。 
    return temp;			//唯一出口,不用考虑temp值为1或者0。 
} 
  
int main(){
    int n;
	scanf("%d", &n);
	int a[n];
    for(int i=0;i<n;i++){
        scanf("%d", &a[i]); 
        if(isBeautiful(a[i])==1){
            printf("Yes\n");
        }
        else{
        	printf("No\n");
        }
      }
      return 0;
} 

  

 2019-03-07  19:37:35

 

posted @ 2019-03-07 21:15  耿红军  阅读(786)  评论(1编辑  收藏  举报