C语言ACM1133,关于怎么样提高运算速度的问题。

来源:百度知道 编辑:UC知道 时间:2024/06/18 09:28:59
#include<stdio.h>

main()
{
long int a;
int s1,s2;
int b(long p);
int d(long w);
scanf("%ld",&a);
while(a!=0)
{
a+=1;
while(a<=10000000)
{
if(b(a)==d(a)) break;
else a=a+1;
}
printf("%d\n",a);
scanf("%ld",&a);
}
}

int b(long p)
{
int q=0,s=0;
while(q=9)
{

if(p<10)
{
s=s+p;
break;
}
s=s+p%10;
p=p/10;
q++;
}
return(s);
}
int d(long w)
{
int i,j,s3=0,t=0;
for(i=2;i<=w;i++)
{
for(j=2;j<=i;j++)
{
if(i==j)
while(w%i==0)
{
if

发现你求素数的方法并不太好.对每个输入,你都来一个这样的二重循环求素数
for(i=2;i<=w;i++)
for(j=2;j<=i;j++)
他的数字是很大的.最多8位数,你的程序对于4937774这个输入,都超过一秒了,更何况他不止于1个输入.

所以,要改进你的程序,主要是改进求素数的方法.
其中一种方法就是筛法,我是用这个方法的,
就是预先把需要的素数都求出来.
你搜索一下吧..若有需要,也可以给一个筛法求素数的函数给你.

然后计算时,就可以通过一个很小的循环获得他的所有素数因子.

用这个算法似乎好一些:
#include <stdio.h>
#include <math.h>

long depart(long int N)
{
long sum=0;
long i,a;
while(N>1)
{
for(i=2;i<=sqrt(N);i++)
if(N%i==0)
{
for(a=i;a>0;a/=10)
sum+=a%10;
N/=i;
break;
}
if( i>sqrt(N) && sum!=0)
{
for(a=N;a>0;a/=10)
sum += a%10;
N=1;
}
else if(i>sqrt(N) && sum==0)
return 0;
}
return sum;
}

int main()
{
long num,n;
long sum ;
while( scanf("%d",&num)!=EOF )