1 条题解

  • 0
    @ 2025-4-8 20:11:50

    解题思路

    1. 输入处理
      • 使用 cin 持续读取字符串 str,当字符串首字符为 * 时结束输入。
      • 初始化字符数组 chwchn 用于存储转换前后的字符和数字。
    2. 数字转字符函数 turnnumtoword
      • 初始化数组 n 用于存储转换过程中的中间值,以及字符数组 st1st2 用于临时存储数字。
      • 对输入的数字字符串 st1 进行处理,将其每一位数字转换为对应的数值并进行计算,判断是否需要进位处理。
      • 当计算结果为 0 时,对结果进行调整,使得转换后的字符符合要求。
      • 将转换后的数值存储在数组 n 中,最后将 n 中的值转换为对应的字符存储在 chw 数组中。
    3. 字符转数字函数 turnwordtonum
      • 初始化字符数组 c26trsum 用于存储转换过程中的中间值。
      • 对于输入的字符数组 chw,将每个字符转换为对应的数值,并按照特定的计算规则进行乘法和加法运算。
      • 每次运算后更新 c26 数组,最终得到转换后的数字存储在 sum 数组中。
      • 处理 sum 数组,去除前导 0,将结果存储在 chn 数组中。
    4. 输出函数 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
    上传者