大数问题......
根据先余为低位,后余为高位的基本思想,进行26->10进制的互相转换。
注意如果输入为的10进制数为26的整数时,要先减一再求余,最后结果在加a..因为目标进制没有表示0的数
Presentation Error 了好几次。。要看到这句话“and the corresponding word number starting in column 23”
#include <stdio.h> #include <string.h> char str[50]; char num[50]; void strtonum(void) //字母转数字 { int tem[50]; int last; int i,j; bool sign=true; int remainder=0; int len=strlen(str); for (i=0;i<len;i++) tem[i]=str[i]-'a'+1; j=0; while(sign) //当tem不全为零 { remainder=0; for (i=0;i<len;i++) { last=tem[i]; tem[i]=(remainder*26 +last)/10; //储存商,做为下一轮的被除数 remainder=(remainder*26+last)%10; } if((j+1)%4==0) num[j++]=','; num[j++]=remainder+'0'; //先余为低位,倒序储存 sign=false; for (i=0;i<len;i++) if(tem[i]!=0) { sign=true; break; } } num[j]=' '; //设置结束标志 } void numtostr(void) //数字转字母 { int tem[50]; int len=strlen(num); int i,j; int c; bool sign=true; int remainder=0; for (i=0;i<len;i++) tem[i]=num[i]-'0'; j=0; while(sign) //当tem不全为零时 { remainder=0; for (i=0;i<len;i++) { c=tem[i]; if(i==len-1) { tem[i]=(remainder*10+c-1)/26; //减一是为了防止当输入的数为26的整数倍时,发生错误 remainder= (remainder*10+c-1)%26; } else { tem[i]=(remainder*10+c)/26; remainder= (remainder*10+c)%26; } } str[j++]=remainder+'a'; sign=false; for (i=0;i<len;i++) if(tem[i]!=0) { sign=true; break; } } str[j]=' '; } int main() { char tem[50]; int i,j; while(scanf("%s",tem)&&tem[0]!='*') { if(tem[0]>='0'&&tem[0]<='9') { strcpy(num,tem); numtostr(); for(i=strlen(str)-1;i>=0;i--) printf("%c",str[i]); for(i=23-strlen(str)-1;i>0;i--) //从第23列输出数字 printf(" "); for (i=0;i<strlen(num);i++) { if(i==strlen(num)%3&&i!=0) printf(","); else if(i%3-strlen(num)%3==0&&i!=0) printf(","); printf("%c",num[i]); } } else { strcpy(str,tem); strtonum(); printf("%s",str); for(i=23-strlen(str)-1;i>0;i--) printf(" "); for(i=strlen(num)-1;i>=0;i--) printf("%c",num[i]); } printf(" "); } return 0; }