1 条题解
-
0
解题思路
- 输入处理:
- 使用
cin
持续读取字符串str
,当字符串首字符为*
时结束输入。 - 初始化字符数组
chw
和chn
用于存储转换前后的字符和数字。
- 使用
- 数字转字符函数
turnnumtoword
:- 初始化数组
n
用于存储转换过程中的中间值,以及字符数组st1
和st2
用于临时存储数字。 - 对输入的数字字符串
st1
进行处理,将其每一位数字转换为对应的数值并进行计算,判断是否需要进位处理。 - 当计算结果为 0 时,对结果进行调整,使得转换后的字符符合要求。
- 将转换后的数值存储在数组
n
中,最后将n
中的值转换为对应的字符存储在chw
数组中。
- 初始化数组
- 字符转数字函数
turnwordtonum
:- 初始化字符数组
c26
、tr
和sum
用于存储转换过程中的中间值。 - 对于输入的字符数组
chw
,将每个字符转换为对应的数值,并按照特定的计算规则进行乘法和加法运算。 - 每次运算后更新
c26
数组,最终得到转换后的数字存储在sum
数组中。 - 处理
sum
数组,去除前导 0,将结果存储在chn
数组中。
- 初始化字符数组
- 输出函数
output
:- 计算字符数组
chw
和数字数组chn
的长度。 - 输出
chw
数组中的字符,然后根据长度差异输出一定数量的空格。 - 输出
chn
数组中的数字,并且每三位数字之间添加逗号,最后换行。
- 计算字符数组
#include<iostream> #include<string> #include<cstring> using namespace std; char chw[40],chn[40]; int length; void turnnumtoword() { int n[40]={0},i,j,k,l,m=1; char st1[40],st2[40]; for(i=0;i<40;i++) st1[i]=st2[i]='\0'; for(i=0;i<length;i++) st1[i]=chn[i]; while(1) { k=0; l=strlen(st1); for(i=0;i<l;i++) { k*=10; k+=st1[i]-'0'; st2[i]=k/26+'0'; k%=26; } for(i=0;i<40;i++) st1[i]='\0'; bool t=0; for(i=0;i<l;i++) { if(st2[i]!='0'&&!t) { t=1; j=i; } if(t)st1[i-j]=st2[i]; } if(k==0) { k=26; l=strlen(st1); for(i=l-1;i>=0;i--) if(st1[i]!='0')break; st1[i]--; for(j=i+1;j<l;j++) st1[j]='9'; } n[m]=k; m++; if(!t)break; } for(i=1;i<m;i++) chw[i-1]=n[m-i]+'a'-1; } void turnwordtonum() { char c26[40],tr[40],sum[40]; int i,j,k,m,n,s,t,t2,l1,l2; for(i=0;i<40;i++) c26[i]=tr[i]=sum[i]='0'; c26[0]='1'; for(i=length-1;i>=0;i--) { char ct[10]; for(j=0;j<10;j++) ct[j]='0'; n=chw[i]-'a'+1; if(n<=9) { ct[0]=n+'0'; l2=1; } else { ct[0]=n%10+'0'; ct[1]=n/10+'0'; l2=2; } for(j=0;j<40;j++) tr[j]='0'; for(l1=39;l1>=0;l1--) if(c26[l1]!='0')break; l1++; for(j=0;j<l2;j++) { n=ct[j]-'0'; t2=t=0; for(k=0;k<=l1+1;k++) { m=c26[k]-'0'; s=m*n+t2; t2=s/10; s%=10; s+=t+tr[k+j]-'0'; t=s/10; s%=10; tr[k+j]=s+'0'; } } t=0; for(j=0;j<=l1+3;j++) { m=sum[j]-'0'; n=tr[j]-'0'; s=m+n+t; t=s/10; s%=10; sum[j]=s+'0'; } ct[0]='6'; ct[1]='2'; l2=2; for(j=0;j<40;j++) tr[j]='0'; for(j=0;j<l2;j++) { n=ct[j]-'0'; t2=t=0; for(k=0;k<=l1+1;k++) { m=c26[k]-'0'; s=m*n+t2; t2=s/10; s%=10; s+=t+tr[k+j]-'0'; t=s/10; s%=10; tr[k+j]=s+'0'; } } for(j=0;j<40;j++) c26[j]=tr[j]; } for(i=39;i>=0;i--) if(sum[i]!='0')break; for(j=0;j<=i;j++) chn[j]=sum[i-j]; } void output() { int l1=strlen(chw),l2=strlen(chn),i,j; cout<<chw; for(i=1;i<=22-l1;i++) cout<<" "; for(i=0;i<l2;i++) { cout<<chn[i]; if((l2-i)%3==1&&l2-i>1)cout<<","; } cout<<endl; } int main() { string str; int i,j,k; while(cin>>str) { if(str[0]=='*')return 0; for(i=0;i<40;i++) chw[i]=chn[i]='\0'; length=str.length(); if(str[0]>='0'&&str[0]<='9') { for(i=0;i<str.length();i++) chn[i]=str[i]; turnnumtoword(); } else { for(i=0;i<str.length();i++) chw[i]=str[i]; turnwordtonum(); } output(); } }
- 输入处理:
- 1
信息
- ID
- 313
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者