大数问题......
根据先余为低位,后余为高位的基本思想,进行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]='\0'; //设置结束标志
}
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]='\0';
}
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("\n");
}
return 0;
}