我这道C语言题为什么超时啊?

来源:百度知道 编辑:UC知道 时间:2024/09/23 07:04:58
#include<stdio.h>
#include<math.h>
#include<string.h>
int sum(int n)
{
int x,i,j,a[1000],sum1;
for(i=1,x=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(i*j==n&&i!=j)
{
a[x]=i;
a[x+1]=j;
x=x+2;
break;
}
else if(i*j==n&&i==j)
{
a[x]=i;
x=x+1;
break;
}
}
}
for(i=0,sum1=0;i<x;i++)
sum1+=a[i];
return(sum1);
}
void main()
{
int l,x,i,m,n,t,j,a[1000],b[1000],sum1,sum2;
scanf("%d",&l);
while(l--)
{
scanf("%d %d",&m,&n);
sum1=sum(n);
sum2=sum(m);
if(sum1+1==m&&sum2+1==n)
printf("YES\n");
else
printf("NO\n");
}
}
Problem Description

古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:

1+2+4+5+10+11+20+22+44+55+110=284。

而284的所有真约

就本题而言,原程序中的sum()函数过于复杂,而且许多变量的定义根本没有必要,精简如下:

//---------------------------------------------------------------------------

#include<stdio.h>
int sum(int n)
{
int i,s=0;
for (i=1; i<n; i++) s+=!(n%i)?i:0;
return s;
}

void main()
{
int l,m,n,sum1,sum2;
scanf("%d",&l);
while(l--)
{
scanf("%d%d",&m,&n);
sum1=sum(n);
sum2=sum(m);
if(sum1==m&&sum2==n)
printf("YES\n");
else
printf("NO\n");
}
}
//---------------------------------------------------------------------------

太难了吧。。。

可能是你的sum函数写成了n平方复杂度的了,可以这样写:
int sum(int n)
{
int re=0,i;
for(i=2;i<=n/2;i++)
if(n%i==0)
re+=i;
return re;
}

c语言已经忘得差不多了。我不知道对不对。
sum1在主函数里面已经定义了,为什么在调用函数里面还要出现一个。
while应当和do一起使用吧。