题目来源:http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1003&cid=31288&problem=Problem%20%20C
解法或类型:循环结构。
Description
s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何
数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
题意描述
输入一个数判断是否为不可摸数。
解题思路
先计算1000000以内所有数的真因子之和,然后判断真因子之和是否小于等于1000,如果符合条件然后以这个数为下标组成一个数组这个下标代表的数是1。然后以输入的数为下标判定这个下标代表的数的值是否为1,是1不可摸数,反之不是不可摸数。
程序代码:
#include<stdio.h>
int main()
{
inta[50000],b[50000],m,n,i,t,sum,j,d;
scanf("%d",&m);
t=0;
for(i=1;i<=50000;i++)
{
sum=0;
for(j=1;j<=i/2;j++)
{
if(i%j==0)
sum+=j;
}
a[t]=sum;
t++;
}
for(i=0;i<t;i++)
{
if(a[i]<1000)
b[a[i]]=1;
}
while(m--)
{
d=0;
scanf("%d",&n);
if(b[n])
printf("no\n");
else
printf("yes\n");
}
return 0;
} 这个还是错的。
错误分析: 1、开始没有打表,直接计算1000000以内所有数的真因子之和,然后判断是否有真因子之和等于输入的数。超时。
2、打表打错。