Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Aufgabe: Umwandlung von Dezimalzahlen in Zahlzeichen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
20.04.2003, 19:55 Uhr
~gentleman
Gast


Hallo Füchse,

eine kleine Aufgabe für Euch!! Ich habe mich daran versucht bin aber nicht allzuweit gekommen weil mir der entscheidende Algorithmus dafür nicht in den Sinn kommen will. Die Aufgabe lautet:

Umwandlung von Dezimalzahlen (ganze Zahlen) in Zahlzeichen (ähnlich dem römischen System) Der Wert ist 1 bis 4096, jedoch zur Basis 16.

Zeichen Wert
---------------------
A 1 (16^0)
B 8 (1/2*16^1)
C 16 (16^1)
D 128 (1/2*16^2)
E 256 (16^2)
F 2048 (1/2*16^3)
G 4096 (16^3)


Bedingung:

Addition bei Aufeinanderfolge wertgleicher oder im Wert fallender Symbole, sonst Subtraktion. Bei der Addition sind max. 6 wertgleiche Symbole nebeneinander erlaubt, bei der Subtraktion keine.

Beispiele: AB(7), CCCB(56), CEAA(242), EG(3840), CCCCCC(96)

Das Testprogramm als Schleife und bei Eingabe einer Null beendet das Programm.


Ich bin gespannt....


Gruss,

Gentleman
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.04.2003, 14:25 Uhr
virtual
Sexiest Bit alive
(Operator)


Na, das war ja endlich mal was ulkiges

C++:
#include <iostream>
#include <string>

unsigned  digits[] = { 1<<0, 1<<3, 1<<4, 1<<7, 1<<8, 1<<11, 1<<12};

int main()
{
    std::string line;

    for(;;)
    {
        unsigned long number;

        std::cout<<"Bitte Zahl eingeben: "<<std::flush;
        std::getline(std::cin, line);
        if (1!=sscanf(line.c_str(), "%lu", &number))
        {
            std::cerr<<"Fehlerhafte Eingabe - bitte nochmal!"<<std::endl;
            continue;
        }
        else if(0 == number)
        {
            std::cout <<"bye bye."<<std::endl;
            break;
        }

        std::string str;
        for(int i=sizeof(digits)/sizeof(digits[0])-1; i>=0 && number!=0; --i)
        {
            if (number>=digits[i])
            {
                for(int j=0; j<6 && number>=digits[ i]; ++j)
                {
                    str += 'A'+i;
                    number -= digits[ i];
                }
            }
            else
            {
                unsigned long diff = digits[i]-number;
                for(int j=i-1; j>=0; --j)
                {
                    if (digits[j]==number)
                    {
                        str += 'A'+j;
                        number = 0;
                        break;
                    }
                    else if (digits[j] == diff)
                    {
                        str += 'A'+j;
                        str += 'A'+i;
                        number -= digits[ i]-digits[j];
                        break;
                    }
                }
            }
        }

        std::cout<<str<<'('<<line<<')'<<std::endl;
    }
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.04.2003, 14:54 Uhr
~gentleman
Gast


Hallo virtual,

nicht schlecht!! hätte gar nicht erwartet dass sich da jetzt wirklich jemand hinsetzt und das bis zum ende durchprogrammiert. du bist wohl etwas mehr im thema drin als ich!! ich kanns aber nicht kompilieren, da er in zeile 11 und 63 einen fehler angibt (Z.63--> for statemant missing, Z.11--> expression syntax) Und ich versteh das mit dem Bereichsauflösungsoperator noch nicht ganz. Ich hatte das ganze mit einer switch anweisung und verschachtelter if-anwesisungen versucht, aber deins ist natürlich eleganter...wenns läuft. am schwierigsten ist ja eigentlich der algorithmus.

gruss

gentleman
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.04.2003, 15:26 Uhr
~0xdeadbeef
Gast


Ersetz den Smiley durch ein ; ), dann sollte das gehen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.04.2003, 15:50 Uhr
~gentleman
Gast


ok, die leere for schleife steht, aber jetzt fehler in Zeile_17:

if (1!=sscanf(line.c_str(), "%lu", &number))


Kommentar: Call to undefined function 'sscanf' in function main
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.04.2003, 16:18 Uhr
virtual
Sexiest Bit alive
(Operator)


Dann fehlt da ein Header, den mein Compiler implizit includiert,
Probier mal

C++:
#include <cstdio>


Nicht vergessen: Ist C++ Source!
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.04.2003, 16:34 Uhr
~gentleman
Gast


der header war ohne wirkung. ich benutze übrigens einen borland compiler (BCC55)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.04.2003, 16:37 Uhr
~gentleman
Gast


Ja in c++ wollte ichs auch haben!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.04.2003, 17:24 Uhr
virtual
Sexiest Bit alive
(Operator)


Keine Ahnung, bei mir tut es. Kenne mich mit Windows nicht so aus,
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.04.2003, 17:37 Uhr
~gentleman
Gast


mein lösungsanatz war so...aber irgendwo ist ein haken. ausserdem ist die addition bzw. subtraktion der aufsteigenden bzw. absteigenden wertzeichen noch nicht integriert.



C++:

#include <iostream.h>

int main ()
{
    int zahl, resta, restb, restc, restd, reste, restf, restg, i;
    char ergebnis [6];
    
    cin>>zahl;
    
    cout<<"Zahl:"<<zahl<<"\n";
    
    
    
    for (i=7; i==0; i--)
    {
        restg = zahl%4096;    
        if (restg<0)
            restf = zahl%2048;
            if(restf<0)
                reste = zahl%256;
                if(reste<0)
                    restd = zahl%128;
                    if(restd<0)
                        restc = zahl%16;
                        if(restc<0)
                            restb = zahl%8;
                            else (restb<0)
                                resta = zahl%1;
                            else if
                            {
                                ergebnis[0] = 'A';
                                cout<<"Ergebnis: "<<ergebnis;
                                
                            }
                        else if
                        {
                            ergebnis[0] = 'B';
                            cout<<"Ergebnis: "<<ergebnis;
                            
                        }
                    else if
                    {
                        ergebnis[0] = 'C';
                        cout<<"Ergebnis: "<<ergebnis;
                        break;
                    }
                    
                else if
                {
                    ergebnis[0] = 'D';
                    cout<<"Ergebnis: "<<ergebnis;
                    break;
                }
            else if
            {
                ergebnis[0] = 'E';
                cout<<"Ergebnis: "<<ergebnis;
                break;
            }
        else if
        {
            ergebnis[0] = 'F';
            cout<<"Ergebnis: "<<ergebnis;
            break;
        }
        
        
    }

    
    return 0;
    

}//EOF


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: