若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。
输入格式:
输入在第一行中给出正整数 K(≤10),随后一行给出 K 个待检测的、不超过 104 的正整数。
输出格式:
对每个需要检测的数字,如果它是大美数就在一行中输出 Yes
,否则输出 No
。
输入样例:
3
18 29 40
输出样例:
Yes
No
Yes
解题思路:
踩了不少坑,总结一下吧:
找出一个数的所有因数,不是对这个数做因数分解,所以还要把它自己也算进去
是 四个因数的和/number 不是 number/四个因数的和
测试点2,可能因为比较大的数因数比较多,存因数的数组要开大一点
#include <stdio.h>
#define MAXN 84
int get_factors(int num, int *factors) {
int i, end=0;
for ( i=2; i<=num/2; ++i ) {
if ( num % i == 0 )
factors[++end] = i;
}
factors[++end] = num;
return end;
}
int main() {
int K, num, end, flag, i, j, k, l;
int factors[MAXN] = {1,};
if ( scanf("%d", &K)==EOF ) printf("error\n");
while ( K-- ) {
if ( scanf("%d", &num)==EOF ) printf("error\n");
end = get_factors(num, factors);
if ( end < 3 ) {
printf("No\n");
} else {
flag = 0;
for ( i=0; i<=end; ++i ) {
for ( j=i+1; j<=end; ++j ) {
for ( k=j+1; k<=end; ++k ) {
for ( l=k+1; l<=end; ++l ) {
if ( (factors[i]+factors[j]+factors[k]+factors[l]) % num == 0 ) {
flag = 1;
goto out;
}
}
}
}
}
out:
printf("%s\n", flag ? "Yes" : "No");
}
}
return 0;
}