Zahl aus Arrays in einfache int Variable umwandeln?



  • Hi Erklärbär,
    Deine Lösung kommt der Sache schon verdammt nah. So nah war ich auch schon einmal. Und genau da beginnt für mich der Wald... ich habe den Code wie folgt ergänzt:

    int i = 1, j=0;
    int arr[] = {3,4,3,5};
    int z = 0;
    while(j<3)
    {
    z += arr[j] * i;
    j++; 
    i*=10;
    z += arr[j] * i;
    j++; 
    i*=10; 
    }
    printf("%i",z);
    

    Als Ergebnis liefert er 5343. Das ist leider falsch. Die Zahl die er ausgeben sollte lautet 3435. Hab versucht die Schleife umzuschreiben, bin aber gescheitert 😞
    Gruß, Philippp



  • probier mal so:
    erstmal eine variable (0 -initialisiert):
    int z = 0;
    und dann:
    z = z * 10 + array[0];
    z = z * 10 + array[1];
    z = z * 10 + array[2];
    z = z * 10 + array[3];
    🙂



  • Hi +frickey,
    war gerade dabei eine lange "das geht gar nicht" Anwort zu schreiben. Gut das ich vorher den Code getestet habe...
    Ich werd das ganze nochmal durchrechnen. Es klappt. Ich weiß blos noch nicht genau warum(an dieser Stelle möchte ich auf die Uhrzeit und meinen Schnupfen verweisen... um Ausreden nicht verlegen *g*). Wer jetzt versuchen das ganze in eine Schleife zu packen.
    Gruß, Philippp



  • wie waere es damit:

    #define MY_BASE_NUM_SYSTEM      10
    
    int GetIntFromArray (const int    *iArrayIn,
                         int           iSize)
    {
        int    iReturn = 0,
               iDim    = 1;
    
        for (int iLoop = (iSize - 1); iLoop >= 0; iLoop--)
        {
            iReturn += iArrayIn [iLoop] * iDim;
            iDim *= MY_BASE_NUM_SYSTEM;
        }
    
        return iReturn;
    }
    


  • hartmut1164 schrieb:

    wie waere es damit:

    #define MY_BASE_NUM_SYSTEM      10
    
    int GetIntFromArray (const int    *iArrayIn,
                         int           iSize)
    {
        int    iReturn = 0,
               iDim    = 1;
        
        for (int iLoop = (iSize - 1); iLoop >= 0; iLoop--)
        {
            iReturn += iArrayIn [iLoop] * iDim;
            iDim *= MY_BASE_NUM_SYSTEM;
        }
    
        return iReturn;
    }
    

    ^^ huh? viel zu kompliziert für diese einfach aufgabe. das kannste viel einfacher haben:

    int GetIntFromArray (int *array, int size)
    {
      int i = 0;
      while (size--)
        i = BASE_NUM_SYSTEM * i + *array++;
      return i;
    }
    

    ^^pFlip: da hast du die schleife, falls du's noch nicht selbst gemacht hast.
    🙂



  • Man kann es noch eleganter machen:

    #define MY_BASE_NUM_SYSTEM      10 
    
    typdef struct NoList
    {
            int      iNo;
    
            NoList  *pBefore = NULL,
                    *pNext   = NULL;
    }
    
    int GetIntFromList (NoList  *pIn,
                        int      iValue)
    {
            if (pIn != NULL)
                    return iValue;
            else
                    return GetIntFromList (pIn->pBefore, iValue * MY_BASE_NUM_SYSTEM + pIn->iNo);
    }
    
    NoList *GetLastInList (NoList  *pIn)
    {
            if (pIn->pNext == NULL)
                    return pIn;
            else
                    return GetLastInList (pIn->pNext);
    }
    
    int main ()
    {
    
    /* Irgentwas */
    
    printf ("My sum %d\n", GetIntFromListSingle (GetLastInList (pIn), 0));
    
    /* Noch Irgentwas */
    

    🤡



  • hartmut1164 schrieb:

    Man kann es noch umständlicher machen:
    🤡

    stimmt.
    🙂



  • +fricky schrieb:

    hartmut1164 schrieb:

    Man kann es noch umständlicher machen:
    🤡

    stimmt.
    🙂

    Nicht unbedingt - die Arbeit wird getan von einer einzigen Vier-Zeile-if-else-Sequence:

    int GetIntFromList (NoList  *pIn,
                        int      iValue)
    {
            if (pIn != NULL)
                    return iValue;
            else
                    return GetIntFromList (pIn->pBefore, iValue * MY_BASE_NUM_SYSTEM + pIn->iNo);
    }
    


  • Hab die Schleife noch selbst hinbekommen. Sogar recht schnell *stolz*. Irgendwie peinlich. So komplex war die Aufgabe nun nicht...
    Meine Lösung:

    while(cz<=c) /*c= Anzahl der Stellen im Array. cz= einfacher Counter*/
            {  
            erg = erg * 10 + addition[cz]; /*erg= int Variable Ergebnis, addition[]=Array mit den Zahlen*/
            cz++;
            }
    

    Danke noch einmal an alle für die Hilfe.
    Gruß, Philippp



  • hartmut1164 schrieb:

    +fricky schrieb:

    hartmut1164 schrieb:

    Man kann es noch umständlicher machen:
    🤡

    stimmt.
    🙂

    Nicht unbedingt - die Arbeit wird getan von einer einzigen Vier-Zeile-if-else-Sequence:

    brauchst nur 3 zeilen, das 'else' kannste weglassen, code hinter einem return wird nicht mehr ausgeführt. aber warst du nicht der, für den mehr als ein return pro funktion frevel ist?
    🙂



  • +fricky schrieb:

    brauchst nur 3 zeilen, das 'else' kannste weglassen, code hinter einem return wird nicht mehr ausgeführt. aber warst du nicht der, für den mehr als ein return pro funktion frevel ist?
    🙂

    Ja - mit einer Ausnahme: Bei Recursionen, da der Stack hier stark belastet wird und man deshalb mit lokalen Variablen sparsamst umgehen sollte.


Anmelden zum Antworten