2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Числа Смита
Сообщение19.03.2014, 17:54 
]Укажите пожалуйста, где в этом коде ошибка? или как дополнить его надо, чтобы её исправить,
само задание: найти все числа Смита (при компилировании вводим число до которого ищутся числа, и затем выводятся в .txt). Проблема в том , что не все числа Смита выводятся, например ищем все числа до числа 666, выводятся все числа которые нашли, и оказывается не достает нескольких чисел, а те которые были найдены и в самом деле являются числами Смита
Код:
#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;
    FILE *fout; fout=fopen("Smith_nums.txt","w");
    printf("Enter n:"); scanf("%d", &n);
    for(i=2;i<n;i++) if(testprime(i)==1) i++; else {
    if(dsum(i)==primedsum(i)) fprintf(fout,"%d, ",i);}
    fclose(fout);
return 0;   
}

 
 
 
 Re: Числа Смита
Сообщение19.03.2014, 18:43 
Аватара пользователя
germ9c в сообщении #838708 писал(а):
for(i=2;i<n;i++) if(testprime(i)==1) i++;

Замените второе i++ на continue.

 
 
 
 Re: Числа Смита
Сообщение19.03.2014, 18:50 
whitefox
спасибо

 
 
 
 Re: Числа Смита
Сообщение19.03.2014, 18:55 
Аватара пользователя
Впрочем, достаточно просто удалить второе i++.
Или, вообще, весь цикл переписать так:
Используется синтаксис C
for(i=2;i<n;i++) if(!testprime(i) && dsum(i)==primedsum(i)) fprintf(fout,"%d, ",i);

 
 
 
 Re: Числа Смита
Сообщение01.04.2014, 20:48 
Выдавать числа Смита с их разложениями на простые множители и подсчитанной суммой цифр S, тоесть в виде
202=2*101; S=4
165= 5*53; S=13
получилось только так сделать, не могли бы вы исправить, где я напортачил
Код:
#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;
  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 k=2; int p=i; int sum=0;
         for(k=2;k<=p;k++)
           { if(testprime(k)==1)
             for(;p%k==0;p/=k)
            fprintf(fout,"%d*",dsum(k));
           }
       
        fprintf(fout," =%d, ",dsum(i));
       }
    }
  fclose(fout);
  return 0;
}

 
 
 
 Re: Числа Смита
Сообщение01.04.2014, 21:49 
видо изменил код
в результате сделал как нужно, но еще осталось , чтобы в файл записывалось с новой строчки каждое разложение
Код:
#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;
  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;
   
    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));
       }
    }
  fclose(fout);
  return 0;
}

 
 
 
 Re: Числа Смита
Сообщение01.04.2014, 21:55 
Аватара пользователя
germ9c в сообщении #844328 писал(а):
но еще осталось , чтобы в файл записывалось с новой строчки каждое разложение
Вставьте в нужных местах fprintf(fout,"\n");

 
 
 
 Re: Числа Смита
Сообщение05.04.2014, 14:04 
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 ....

 
 
 
 Re: Числа Смита
Сообщение07.04.2014, 21:36 
Аватара пользователя
Простые можно исключить с помощью решета Эратосфена.
Выполнив $\lg n$ операций можно исключить все степени десятки.

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group