014
24.07.2002, 22:51 Uhr
virtual
Sexiest Bit alive (Operator)
|
Da es noch keiner getan hat, hab ich mich mal um das etwas schwerere Rästel gekümmert. Ist etwas länglich, daher habe ich auf Fehlerbehandlung weitestgehend verzichtet:
C++: |
#include <stdio.h> #include <stdlib.h> #include <string.h>
#define EINE_TRILLIONEN 1000ull*1000ull*1000ull*1000ull*1000ull*1000ull
static const char* szBis20[] = { "null", "ein", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun", "zehn", "elf", "zwölf", "dreizehn", "vierzehn", "fünfzehn", "sechzehn", "siebzehn", "achtzehn", "neunzehn" };
static const char* szEiner[] = { "", "ein", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun" };
static const char* szZehner[] = { "", "", "zwanzig", "dreisig", "vierzig", "fünfizig", "sechzig", "siebzig", "achzig", "neunzig" };
static const char* szTausender[] = { "trillionen", "billiarde", "billionen", "milliarde", "millionen", "tausend", "" };
static void n2s100( char* s, unsigned long long n) { int bHundert = 0; if (n>=100) { strcat(s, szEiner[n/100]); strcat(s, "hundert"); n %= 100; bHundert = 1; } if (n>=20) { if (n%10) { strcat(s, szEiner[n%10]); strcat(s, "und"); } strcat(s, szZehner[n/10]); }else if (n>0) { strcat(s, szBis20[n]); }else if (!bHundert) { strcat(s, "null"); } }
static void n2s( char* s, unsigned long long n) { unsigned long long llTausender; int j; if (0==n) { strcat(s, "null"); return; } for(j=0, llTausender = EINE_TRILLIONEN; 7>j && 0!=n; ++j, llTausender /= 1000ull) { unsigned long long llHunderter = n/llTausender;
if (0 != llHunderter) { n2s100(s, llHunderter); if (1==llHunderter) { if (1000ull<llTausender) { strcat(s, "e"); }else if (1ull==llTausender) { strcat(s, "s"); } } strcat(s, szTausender[j]); if (1==llHunderter && j%2==1 && 1000ull<llTausender) { strcat(s, "n"); }
n %= llTausender; } } }
static unsigned long long s2n100( char* s) { unsigned long long n = 0ull; char* p; int j; p = strstr(s, "hundert"); if (NULL != p) { *p = 0; for(j=1; j<10; ++j) if (0==strcmp(szEiner[j], s)) { n += 100*j; break; } s = p+7; } p = strstr(s, "und"); if (NULL != p) { *p = 0; for(j=0; j<10; ++j) { if (0==strcmp(s, szEiner[j])) { n += j; s += strlen(szEiner[j]); break; } } s = p + 3; for(j=2; j<10; ++j) { if (0==strcmp(s, szZehner[j])) { n += 10*j; s += strlen(szZehner[j]); break; } } }else { for(j=2; j<10; ++j) { if (0==strcmp(s, szZehner[j])) { n += 10*j; s += strlen(szZehner[j]); break; } } for(j=19; j>=0; --j) if (0==strncmp(s, szBis20[j], strlen(szBis20[j]))) { n += j; s += strlen(szBis20[j]); break; } }
return n; }
static unsigned long long s2n( char* s) { unsigned long long n = 0; unsigned long long h; unsigned long long llTausender = EINE_TRILLIONEN; char* p; int j; for(j=0; j<6; ++j, llTausender /=1000ull) { p = strstr(s, szTausender[j]); if (NULL != p) { *p = 0; h = s2n100(s); n += llTausender*h; s = p+strlen(szTausender[j]); if (1==h && j%2==1 && 1000ull<llTausender) s++; } } if (strlen(s)) n += s2n100(s); return n; }
#define ITEMSIZE sizeof(long long) void encode( FILE* in, FILE* out) { char s[2048]; unsigned long long buffer[1024]; unsigned len; unsigned j; while (0<(len=fread(buffer, 1, ITEMSIZE*1024, in))) { if (len<1024*ITEMSIZE) { memset((char*)buffer+len, 0, ITEMSIZE); len = ITEMSIZE*((len+ITEMSIZE-1)/ITEMSIZE); } len /= ITEMSIZE; for(j=0; j<len; ++j) { s[0] = 0; n2s(s, buffer[j]); fprintf(out, "%s\n", s); } } }
void decode( FILE* in, FILE* out) { char s[2048]; unsigned long long n; while (fgets(s, sizeof(s), in)) { s[strlen(s)-1] = 0; n = s2n(s); fwrite(&n, sizeof(n), 1, out); } }
int main( int argc, char** argv) { const char* filename; char* backup; char buffer[4096]; unsigned len; int mode = 'e'; FILE* in; FILE* out;
switch(argc) { case 2: filename = argv[1]; break; case 3: filename = argv[2]; mode = 'd'; break; default: fprintf(stderr,"*** ERROR: illegal command line\nusage: sonntag2 [-d] file\n"); exit(EXIT_FAILURE); break; }
backup = malloc(strlen(filename)+5); sprintf(backup, "%s.tmp", filename); in = fopen(filename, "rb"); out = fopen(backup, "wb"); while (0<(len=fread(buffer, 1, sizeof(buffer), in))) fwrite(buffer, len, 1, out); fclose(in); fclose(out); in = fopen(backup, mode=='e'? "rb":"r"); out = fopen(filename, mode=='e'? "w": "wb"); if (mode=='e') encode(in, out); else decode(in, out); fclose(in); fclose(out);
remove(backup); free(backup); return EXIT_SUCCESS; }
|
Ich verspreche, das nächste Mal ein Rätsel zu suchen, was sich mit weniger Aufwand lösen läßt. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |