2017-09-02 1 views
-1

Ich versuche, eine Funktion in C++ zu schreiben, die Armstrong-Nummern in einem Bereich von eins bis zu wo von einem Benutzer angegeben erkennt und druckt. Es gibt auch zurück, wie viele es als Integer gibt. Die größte Zahl, zu der es gelesen wird, ist 9.999.Armstrong-Nummer Drucken Fehler

Das Problem, das ich habe, ist, dass es jede Armstrong-Nummer bis 8208 erkennt, aber nicht 9474, die beide Armstrong-Nummern sind. Das führt zu großer Verwirrung, da ich die Zahlen basierend auf der Anzahl der Ziffern verarbeite. Wenn sie 8208 erfolgreich identifiziert, sollte sie auch 9474 identifizieren.

Hier ist mein Code:

int isArmstrongNum(int range){ 
    int count = 0; 
    int ones; 
    int tens; 
    int hundreds; 
    int thousands; 
    if(range < 1 || range > 9999){ 
     cout << "invalid entry" << endl; 
     return 0; 
    } 
    for(int i = 1; i < range; i++){ 
     if(i < 10){ 
      if(pow(i, 1) == i){ 
       count++; 
       cout << i << endl; 
      } 
     } 
     else if(i > 9 && i < 100){ 
      ones = i % 10; 
      tens = (i - ones)/10; 
      if(pow(ones,2) + pow(tens,2) == i){ 
       count++; 
       cout << i << endl; 
      } 
     } 
     else if(i > 99 && i < 1000){ 
      ones = i % 10; 
      tens = ((i % 100) - ones)/10; 
      hundreds = (i - tens * 10 - ones)/100; 
      if(pow(ones,3) + pow(tens, 3) + pow(hundreds,3) == i){ 
       count++; 
       cout << i << endl; 
      } 
     } 
     else if(i > 999 && i < 10000){ 
      ones = i % 10; 
      tens = ((i % 100) - ones)/10; 
      hundreds = ((i % 1000) - tens*10 - ones)/100; 
      thousands = (i - hundreds * 100 - tens * 10 - ones)/1000; 
      if(pow(ones,4) + pow(tens, 4) + pow(hundreds, 4) + 
pow(thousands, 4) == i){ 
       count++; 
       cout << i << endl; 
      } 
     } 

    } 
    return count; 

}

Jede Idee, warum es so verhält? Vielen Dank.

+0

Wenn Sie gebeten wurden, Amstrong Number bis 1000000 zu finden, werden Sie immer noch so viele variable und bedingte Anweisungen erstellen? Ich schlage vor, Sie sollten zuerst Ihr Programm verallgemeinern. – Ishpreet

+0

Verwenden Sie 'pow' nicht, um eine ganze Zahl zu quadrieren - verwenden Sie' x * x'. Ähnlich für die anderen kleinen ganzzahligen Potenzen. –

+0

Sie sollten die Funktion umbenennen, da es irgendwie irreführend ist ... – pmaxim98

Antwort

-1

Hoffe, das hilft!

#include <iostream> 
#include <cmath> 
using namespace std; 

bool is_armstrong(int number) 
{ 
    int length=0,n=number,temp=0; 
    while(n>0) 
    { 
     length++; 
     n/=10; 
    } 
    n=number; 
    while(n>0) 
    { 
     temp+=pow(n%10,length); 
     n/=10; 
    } 
    if(temp==number) 
     return true; 
    return false; 
} 

int main() 
{ 
    int i,start_range=1,end_range=9999; 
    for(i=start_range;i<=end_range;i++) 
    { 
     if(is_armstrong(i)) 
      cout<<i<<endl; 
    } 
    return 0; 
} 

Output: 
1 
2 
3 
4 
5 
6 
7 
8 
9 
153 
370 
371 
407 
1634 
8208 
9474 
+1

Bitte erklären * warum * dieser Code würde helfen? Warum ist das anders? –

+0

@ThomasMatthews Da Sie keine bedingte Anweisung für jede Ziffer wie hundert oder tausend erstellen müssen. – Ishpreet

+1

Wenn Sie Code als Antwort eingeben, kommentieren Sie bitte Ihren Code und antworten Sie. –