2017-01-23 7 views
0

Ich habe diesen Code geschrieben, um alle starken Zahlen von 1 bis n zu drucken, bekomme aber die Ausgabe überhaupt nicht. Das Terminal bleibt nach dem Programmstart stecken, ich habe keine Ahnung, wo ich falsch liege. Bitte korrigieren Sie mich.C Programm zum Drucken aller starken Zahlen von 1 bis n

145 ist eine starke Zahl, da 1! + 4! + 5! == 145

#include <stdio.h> 

void main() { 
    int i = 1, fact, sum, n, a; 
    long int number; 

    printf("\n Find Strong numbers between 1 to \n"); 
    scanf("\n%ld", &number); 

    printf("\n All Strong numbers between 1 to %ld are:\n", number); 

    for (int j = 1; j <= number; j++) { 
     sum = 0; 

     while (j != 0) { 
      a = j % 10; 
      j = j/10; 
      fact = 1; 

      while (i <= a) { 
       fact = fact * a; 
       a--; 
      } 
      sum = sum + fact; 
     } 
     if (j == sum) 
      printf("\n%d\n", j); 
    } 
} 
+0

zu finden, wo Sie grundsätzlich falsch gehen, ist, dass die 'for' Die Schleife iteriert, indem sie "j" erhöht, und die erste innere "while" -Schleife reduziert "j" auf Null. In Kombination bedeutet das eine Endlosschleife. Es bedeutet auch, dass "j == Summe" niemals wahr ist, also wird keine Ausgabe erzeugt. In Kombination wird dies den Code als "festgefahren" erscheinen lassen - das Programm läuft kontinuierlich und produziert keine Ausgabe. Schließlich gibt 'main()' 'int', nicht' void' zurück. – Peter

+0

Ich bin nicht davon überzeugt, scanf mit '\ n' zu verwenden. Bitte lesen Sie hier, wie Sie scanf mit langen Ganzzahlen verwenden können. [Siehe hier] (http://stackoverflow.com/questions/2852390/using-scanf-in-c-c) – allevo

Antwort

0

Ihr Code in einer Endlos-Schleife in eine andere Schleife aufgrund Ihrer Nutzung Ihrer Schleifenvariable steckt. Die Variable j Ihrer for-Schleife wird bei jeder Iteration um 1 erhöht. Aber auch in dieser Iteration teilen Sie j durch 10, bis es 0 ist. Deshalb ist j immer 1 zu Beginn jeder Wiederholung Ihrer for-Schleife.

Die Lösung verwendet einfach eine zusätzliche Variable für Ihre while-Schleife und initialisiert sie für diese Iteration auf den Wert von j. Siehe unten für den Code, der das löst.

void main() 
{ 
    int i=1,fact,sum, n, a, tmp; 
    long int number; 

    printf("\n Find Strong numbers between 1 to \n"); 
    scanf("\n%ld",&number); 

    printf("\n All Strong numbers between 1 to %ld are:\n",number); 

    for(int j=1;j<=number;j++) 
    { 
     tmp = j; 
     sum=0; 

     while(tmp!=0) 
     { 
      a=j%10; 
      tmp=tmp/10; 
      fact=1; 

      while(i<=a) 
      { 
       fact=fact*a; 
       a--; 
      } 
      sum=sum+fact; 
     } 
     if(j==sum) 
      printf("\n%d\n",j); 

    } 
} 
+0

Vielen Dank. –

0
j=j/10; 

ist j beeinflussen. Dann vergleichen Sie diese modifizierte j mit Summe in

if(j==sum) 
    printf("\n%d\n",j); 
+0

Vielen Dank, ich habe es jetzt –

1
#include <stdio.h> 
#include <conio.h> 

void main() { 
    char next_time; 
    int num, fact, n, sum = 0, i, value; 
    next_time = 'y'; 
    while (next_time == 'y' || next_time == 'Y') { 
     printf("Enter a number to check whether a number is strong or not:\t"); 
     scanf("%d", &num); 
     value = num; 

     while (num != 0) { 
      fact = 1; 
      n = num % 10; 
      num = num/10; 
      for (i = 1; i <= n; i++) { 
       fact *= i; 
      } 
      sum += fact; 
     } 
     if (sum == value) 
      printf("%d is strong number", value); 
     else 
      printf("%d is not strong number", value); 

     printf("\n\n******************************"); 
     printf("\n\nDo you want to start again?"); 
     printf("\n\nEnter Y or y to to continue and any other key to exit:\t"); 
     scanf(" %c", &next_time); 
     printf("\n*********************************************\n\n"); 
    } 
    getch(); 
} 

Verwenden Inkrementoperator d.h. i++ und die Summe mit Originalnummer vergleichen.

+0

Ihr Programm beantwortet die Frage nicht: * C Programm zum Drucken aller starken Zahlen von 1 bis n * – chqrlie

0

Ihr Programm schlägt fehl, weil Sie den Schleifenzähler j innerhalb der Schleife ändern, um seine Ziffern aufzulisten. Sie vergessen auch, i innerhalb der Schleife neu zu initialisieren.

Hier ist eine einfachere und schnellere Version:

#include <stdio.h> 

int main(void) { 
    unsigned long int factorials[10]; 
    unsigned long int number; 

    factorials[0] = 1; 
    for (int i = 1; i < 10; i++) { 
     factorials[i] = factorials[i - 1] * i; 
    } 

    printf("Find Strong numbers from 1 to "); 
    scanf("%lu", &number); 

    printf("\nAll Strong numbers between 1 to %ld are:\n", number); 

    for (unsigned long int j = 1; j <= number; j++) { 
     long int n, sum = 0; 
     for (n = j; n > 9; n /= 10) { 
      sum += factorials[n % 10]; 
     } 
     sum += factorials[n]; 
     if (j == sum) { 
      printf("%ld\n", j); 
     } 
    } 
    return 0; 
} 
0

Code in C zu starken Zahlen bis 100000 OUTPUT

#include<stdio.h> 
int main() { 
    int ino = 0; 
    int newno = 0; 
    int digit = 1; 
    int fact = 1; 
    int i; 
    for(i = 0; i <= 100000; i++) 
    { 
     ino = i; 
     newno = 0; 
     while(ino != 0) 
     { 
      fact = 1; 
      digit = ino % 10; 
      while(digit > 1) 
      { 
       fact *= digit--;    
      } 
      newno += fact; 
      ino /= 10; 
     } 

     if(i == newno) 
     printf("%d, ",i); 
    } 
    printf("\b\b "); 
return 0; 
} 
Verwandte Themen