Armstrong Zahlen 1-8stellig

  • C

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Bulle.

    Armstrong Zahlen 1-8stellig

    Schönen guten Abend,
    ich hab folgendes Problem und zwar studiere regenerative Energien und habe dieses Semester Informatikgrundlagen mir liegt dieses Fach allerdings nicht besonders nun muss ich ein Programm abgegeben das eben 1-8 stellige Zahlen darauf überprüft ob es armstrong zahlen sind oder nicht.
    Das ganze muss in C programmiert werden.
    Wenn jemand weiß wie das geht oder eventuell sogar so ein programm bereits geschrieben hat und mir das Skript hier posten wäre ich sehr sehr dankbar
    MFG

    Edit by der_Kurt: * Topic verschoben *

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „FlashTek“ ()

    Du weißt aber schon, dass du in diesem Fach ein Prüfung schreiben musst, oder? Das bedeutet, dass fertiger Programmcode nicht zielführend ist. Falls du das weißt, dann versuch es selbst und stell hier Verständnisfragen. Falls dir das egal ist, dann schau hier: pastebin.com/pWHpJfne

    Keine Ahnung ob das funktioniert - habs auch nur durch Googeln gefunden.
    Gruß
    hal2000
    Nach dem, was ich auf Wikipedia gelesen habe, hört sich das für mich nach einem recht trivialen Problem an.
    Ich schreib dir hier mal nen Pseudocode hin, umsetzen solltest du es dann schon selber können:

    Quellcode

    1. Deklariere ERGEBNIS
    2. Deklariere EXPONENT mit Wert 1
    3. Wiederhole
    4. {
    5. Setze ERGEBNIS auf 0
    6. Für jede ZIFFER in ZAHL
    7. {
    8. Erhöhe ERGEBNIS um ZIFFER hoch EXPONENT
    9. }
    10. Wenn ERGEBNIS gleich ZAHL gebe WAHR zurück.
    11. Inkrementiere EXPONENT
    12. }
    13. Bis ERGEBNIS größer oder gleich ZAHL
    14. Gebe FALSCH zurück
    Das geht alle Exponenten ab 1 durch. Auf Wikipedia steht zumindest nicht, dass der Exponent nur 3 sein darf.
    Dann würde ich mir die Zahlen nehmen, in irgendeiner weise aufsplitten, wieder zu einer Zahl konvertieren und dann hoch 3 rechnen. Das machst du mit allen Zahlen. Spontan würde ich sagen, dass das einfache Konvertieren in einen Char-Array und dann durchgehen, zur Zahl konvertieren, potenzieren, zur Summe hinzufügen und danach einfach mit der Ursprungszahl vergleichen. Passend wäre für den ersten Vorgang eine For-Schleife, die eben einen Zahlenbereich durchgeht.
    Ich kann leider nur VB.NET aber du kannst es ja konvertieren lassen:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim Zahl As Double = CDbl(TextBox1.Text)
    6. Dim EndZahl As Double
    7. For Each c As String In Zahl.ToString.ToCharArray
    8. EndZahl += CDbl(c) ^ 3
    9. Next
    10. If EndZahl = Zahl Then
    11. MsgBox("Ist eine Armstrongzahl !")
    12. Else
    13. MsgBox("Ist keine Armstrongzahl !")
    14. End If
    15. End Sub
    16. End Class


    EDIT: In der Textbox ist die Zahl die man prüfen lassen will !
    @Artentus: Du musst die Zahl inkrementieren nicht den Exponent ;)

    Habe auch mal gebastelt (Übungseffekt in C#). Ich denke das lässt sich für dich relativ gut umbauen:

    Quellcode

    1. static void Main(string[] args)
    2. {
    3. string obergrenze = Console.ReadLine();
    4. for (int u = 0; u <= int.Parse(obergrenze); u++)
    5. {
    6. int summe = 0;
    7. foreach(char cr in u.ToString())
    8. {
    9. summe = summe + int.Parse(Math.Pow(int.Parse(cr.ToString()), u.ToString().Length).ToString());
    10. }
    11. if (summe == u)
    12. {
    13. Console.WriteLine(u.ToString());
    14. }
    15. }
    16. Console.ReadKey();
    17. }

    EDIT//: Es funktioniert nun endlich :thumbsup: . Lag wohl an Math.Pow.

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „faxe1008“ ()

    @Bulle

    brauchst du einen algorythmus der
    a) eine beliebige zahl (1-8stellig)
    oder
    b) alle zahlen im bereich von 0-99999999
    so schnell wie möglich überprüft?

    mein weg eine zahl zu überprüfen:

    Quellcode

    1. function isArmstrong (int value)
    2. {
    3. // summe aller ziffern
    4. int sum = 0
    5. // anzahl ziffern
    6. int length = floor(log10( value )) + 1
    7. // für jede ziffer
    8. for (int i=0; i<length; i++)
    9. {
    10. // rechne: sum += ziffer ^ length
    11. sum += pow( (value / pow(10, i) % 10), length)
    12. // precheck
    13. if (sum > value && length-i > 1) return false
    14. }
    15. return ($sum == $value);
    16. }
    (kein fertiger copypaste code, sondern zuerst in php geschrieben und dann umgebaut)

    hab bei meiner version die zahl nicht zu nem string gecastet und dann gesplittet (wieso? wollts mal just4fun ausprobieren)
    zudem wird in der schleife am ende darauf geprüft ob die bisherige summe bereits die eingabe zahl übertrifft oder nicht

    EDIT: funktion gefixt... folgendes hat am ende gefehlt:
    return ($sum == $value);

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Agita“ ()

    Mal abgesehen von den zigtausend Snippets hier. Geh einfach logisch vor: Die Zahl ist eine wenn die Summe ihrer Ziffern, zuvor potenziert mit 3, dieselbe Zahl ergibt. Also zerteil die Zahl in Ziffern, potenziere diese mit 3 und addiere alle. Anschließen nur noch gucken ob die Zahlen gleich sind
    wie auf wikip. steht gibt es nicht sehr viele dieser art von zahlen.
    dort steht auch, dass zwischen 0 und einer dort genannten maximalen zahl es 88 möglichkeiten gibt.
    das heisst... du könntest zum einen eine funktion präsentieren wie sie hier mehrfach genannt wurde, also zum berechnen, aber als alternative könntest du auch einfach eine feste liste mit möglichen armstrongzahlen zwischen 1 und 99999999 erstellen und in einer anderen funktion einfach überprüfen ob die zahl in der liste steht oder nicht ...

    edit: ich würde es so lösen, dass ich beidefunktionen erstelle, die liste anfangs mit dem wertebereich 0-99999999 fülle und die eigentliche funktion die überprüft dann nur ob die gewisse zahl in der list ist oder nicht. schwupps hab ich beides, zum einen eine funktion mit dem algorithmus, zum anderen eine funktion die schnell und performance-schonend ist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agita“ ()