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

浙公网安备 33010602011771号