whitefoxКод:
#include<stdio.h>
#include<math.h>
int dsum(int n)
{ int sum=0;
while (n!=0)
{
sum += n%10;
n/= 10;
}
return sum;
}
int testprime(int p)
{
int i=2;
while(i<=sqrt(p))
{
if(p%i==0) break; else i++;
}
p=sqrt(p)+1;
if(i==p) return 1; else return 0;
}
int primedsum(int n)
{ int sum=0, k=2;
for(k=2;k<=n;k++) {if(testprime(k)==1) for(;n%k==0;n/=k) sum+=dsum(k);}
return sum;
}
int main(void)
{ int i, n, S2=0,S3=0;
FILE *fout; fout=fopen("Smith_nums.txt","w");
printf("Enter n:");
scanf("%d", &n);
for(i=2;i<n;i++)
if(testprime(i)==1)
continue;
else
{ if(dsum(i)==primedsum(i))
{ fprintf(fout,"%d= ",i);
int t=i,k=2,p=0;
S2=S2+1;
if(dsum(i)==13) S3=S3+1;
while(k<=t)
{
if(t%k==0)
{ if (p==0)
fprintf(fout,"%d",k);
else
if(t>1)
fprintf(fout,"*%d",k);
else
fprintf(fout,"%d",k);
t=t/k;
p=1;
}
else
k=k+1;
}
fprintf(fout,";S=%d.",dsum(i));
fprintf(fout,"\n");
}
}
fprintf (fout,"\n Vsego: %d,\n S=13 vsego: %d,\n Vsego: %d",S2,S3,S3*100/S2);
fclose(fout);
return 0;
}
как ускорить этот код, и какие и как добавить условия, чтобы исключить заранее известные "не числа" - Смита -например все простые числа, числа 10 100 1000 10000 1000000 ....