2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Числа Смита
Сообщение19.03.2014, 17:54 


11/04/13
125
]Укажите пожалуйста, где в этом коде ошибка? или как дополнить его надо, чтобы её исправить,
само задание: найти все числа Смита (при компилировании вводим число до которого ищутся числа, и затем выводятся в .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 
Заслуженный участник
Аватара пользователя


19/12/10
1546
germ9c в сообщении #838708 писал(а):
for(i=2;i<n;i++) if(testprime(i)==1) i++;

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

 Профиль  
                  
 
 Re: Числа Смита
Сообщение19.03.2014, 18:50 


11/04/13
125
whitefox
спасибо

 Профиль  
                  
 
 Re: Числа Смита
Сообщение19.03.2014, 18:55 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Впрочем, достаточно просто удалить второе 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 


11/04/13
125
Выдавать числа Смита с их разложениями на простые множители и подсчитанной суммой цифр 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 


11/04/13
125
видо изменил код
в результате сделал как нужно, но еще осталось , чтобы в файл записывалось с новой строчки каждое разложение
Код:
#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 
Заслуженный участник
Аватара пользователя


19/12/10
1546
germ9c в сообщении #844328 писал(а):
но еще осталось , чтобы в файл записывалось с новой строчки каждое разложение
Вставьте в нужных местах fprintf(fout,"\n");

 Профиль  
                  
 
 Re: Числа Смита
Сообщение05.04.2014, 14:04 


11/04/13
125
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 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Простые можно исключить с помощью решета Эратосфена.
Выполнив $\lg n$ операций можно исключить все степени десятки.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group