不可摸数
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 46 Accepted Submission(s) : 11
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何
数m,s(m)都不等于n,则称n为不可摸数.
数m,s(m)都不等于n,则称n为不可摸数.
Input
包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(2<=n<=1000)是整数。
Output
如果n是不可摸数,输出yes,否则输出no
Sample Input
3 2 5 8
Sample Output
yes yes no
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 500000 int sum[MAX], t[1010];//要定义成全局变量,不能定义成局部变量,局部区域的内存空间容纳不了那么大的数组 int main() { int T, i, j, m; // FILE *fp; // fp = fopen("G:\\123.txt","w+"); for(i = 1; i <= MAX / 2; i++) //i是因子,看1---MAX/2可以作为哪些s[j]的因子 for(j = 2 * i, m = 2; j < MAX; j = i * (++m))//i可以加入其整数倍的数组s[j]里,m++倍,另外j不能从i开始,否则每个s[j]就多加了一个本身j sum[j] += i; for(i = 1; i < MAX; i++) { if(sum[i] <= 1000) t[sum[i]] = 1; // fprintf(fp, "%-4d\t", sum[i]); } scanf("%d", &T); while(T--) { int n; scanf("%d", &n); if(t[n]) printf("no\n"); else printf("yes\n"); } return 0; }