C++完数超时问题

来源:百度知道 编辑:UC知道 时间:2024/05/15 03:11:42
#include<stdio.h>
int f(int k)
{
int i,sum=0;
for(i=1;i<k;i++)
{
if(k%i==0)
sum=sum+i;
}
return sum;
}
int main()
{
int n;
printf("PERFECTION OUTPUT\n");
scanf("%d",&n);
while(n)
{
if(f(n)==n)
printf("%d PERFECT\n",n);
else if(f(n)>n)
printf("%d ABUNDANT\n",n);
else
printf("%d DEFICIENT\n",n);
n=0;
scanf("%d",&n);
}
printf("END OF OUTPUT\n");
}

输入一个数
除本身外的因子 之和等于输入的数(完数) 输出PERFECT
除本身外的因子 之和大于输入的数 输出ABUNDANT
除本身外的因子 之和小于输入的数 输出DEFICIENT

ACM通过不去 说超时。。。
还有什么好的算法?

想不出来了。。。。

不对啊 源程序 输入 是正确的

等改完 就跟原来不一样了

上面的函数 是把 所有除本身之外的 因数和求出来

饿 按照你说的 改成<=k/2 就好了

int f(int k)
{
int i,sum=0;
for(i=1;i<k;i++)//这里可以改进,i只需要比较到k的一半就可以了改成: for(i = 1; i <= k/2; i++)这样改后应该不会超时了
{
if(k%i==0)
sum=sum+i;
}
return sum;
}
如果我对因子的定义没有理解错误的话:你求一个数的因子,这个数的最大因子是多少,不正是这个数的一半吗??比如51的最大因子是25, 从26开始一直到50根本就不可能再是51的因子
有问题请留下QQ或者MSN
补充: 我们都仔细想一下有没有更好的解决办法,算法方面我比较垃圾

超时要么是算法不行,要么输入有问题,OJ系统是linux