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