R
Mir hat das Problem einfach keine Ruhe gelassen und ich habe mal etwas gecodet, was wenigstens bis zu paar Trillionen hochzählt (falls du das benötigst ;)) und
in einen entsprechenden String umwandelt. Mehr als Trillionen sind auch nicht drin, da dann der Wertebereich eines unsinged long long int überschritten wird.
Trotzdem erscheint mir die Lösung als nicht sehr elegant, hat da jemand eine andere Ansatzweise/Verbesserungsmöglichkeiten parat?!
#include <stdio.h>
#include <string.h>
/* die Tausenderstellen in Worten; da oftmals der Plural nicht durch bloßes Anhängen */
/* von -en zu bilden ist, initialisieren wir ein extra char*-Array */
char *singular[]={"", "Tausend", "Million", "Milliarde", "Billion", "Billiarde", "Trillion"};
char *plural[]={"", "Tausend", "Millionen", "Milliarden", "Billionen", "Billiarden", "Trillionen"};
int main(void){
unsigned long long int zahl, hilfzahl, teiler=1;
int zaehler=0;
char stringzahl[1000];
strcpy(stringzahl, "");
printf("Zahl eingeben: ");
scanf("%lld", &zahl);
hilfzahl=zahl;
/* zunächst einmal die Tausenderstellen zählen */
while(hilfzahl>=1000 && zaehler<=7){
++zaehler;
teiler*=1000;
hilfzahl/=1000;
}
/* nun folgt die Speicherung in dem String, wobei geloopt wird, bis der Teiler kleiner 1 */
do{
/* wenn die nächste Tausenderstelle keine 0 ist */
if(zahl/teiler>0)
/* speichere in stringzahl... */
/* Formatargumente: stringzahl ist der bisherige String */
/* zahl/teiler ist die nächste Tausenderstelle */
/* plural wird gewählt, wenn die Tausenderstelle > 1 && */
/* wenn die Einerstelle noch nicht erreicht ist */
sprintf(stringzahl, "%s%lld %s ", stringzahl,
zahl/teiler, (zahl/teiler>1 && teiler/1000>1) ? plural[zaehler] : singular[zaehler]);
/* eine Tausenderstelle weniger */
--zaehler;
/* zahl erhält die Restzahl und teiler wird um eine Tausenderstelle verringert */
zahl%=teiler;
teiler/=1000;
}while(teiler>=1);
/* jetzt können wir den String auch mnal ausgeben */
printf("%s\n", stringzahl);
return 0;
}