ZJU 1272 Numerically Speaking

来源:互联网 发布:国家干部网络培训 编辑:程序博客网 时间:2024/05/18 03:28

大数问题......

根据先余为低位,后余为高位的基本思想,进行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;}


 

0 0
原创粉丝点击