Hello. I train in with ++ (not pure), I write the program. Must translate words into numbers (and a-1, b-2, z-26, aa-27 ...) and vice versa. In one direction it works perfectly, and in the other it bangs on any combination of numbers, when translating which into letters the letter z is present. What is the mistake and how can it be fixed?
/* Numerically Speaking */ #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct Big{ int len; int num[50]; }; Big number; Big letter; Big sumn(Big *a, int n, int base) { Big res = *a; int pos=0; int i=0; res.num[pos]+=n; for(i=0; i<=res.len; i++) { if(res.num[i]>base) { res.num[i+1]+=res.num[i]/base; res.num[i]%=base; } } if (res.num[res.len]>0) res.len++; return res; } Big multi(Big *a, int b, int base) { Big res=*a; int r = 0, i; for (i=0;i<res.len || r != 0;i++) { res.num[i] = res.num[i] * b + r; r = res.num[i]/base; res.num[i]%=base; } if (i > res.len) res.len = i; return res; } void let2num() { for(int i=letter.len-1; i>=0; i--) { number=multi(&number, 26, 10); number=sumn(&number, letter.num[i],10); number=multi(&number, 1, 10); } } void num2let() { for(int i=number.len-1; i>=0; i--) { letter=multi(&letter, 10, 26); letter=sumn(&letter, number.num[i], 26); } } int main() { char buf[1024]; int x; while(scanf("%s", buf)==1) { if (!strcmp(buf, "*")) break; if (buf[0]>='0' && buf[0]<='9') { number.len = strlen(buf); for(int i=0; i<number.len; i++) { number.num[i] = buf[number.len-i-1]-'0'; } num2let(); } else { letter.len = strlen(buf); for(int i=0; i<letter.len; i++) { letter.num[i] = buf[letter.len-i-1]-'a'+1; } number.len = 1; let2num(); } for(int i=letter.len-1; i>=0; i--) { printf("%c", ('a'+letter.num[i])-1); } printf("\t"); for(int i=number.len-1; i>=0; i--) { printf("%c", '0'+number.num[i]); if (i && (i%3==0)) { printf(","); } } printf("\n"); memset(&number, 0, sizeof(Big)); memset(&letter, 0, sizeof(Big)); } }
for(int i
and not to write astruct
when declaring variables). - KoVadim