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 ....