第四次上机练习特殊的翻译

小明的工作是对一串英语字符进行特殊的翻译:
当出现连续且相同的小写字母时,须替换成该
字母的大写形式,在大写字母的后面紧跟该小
写字母此次连续出现的个数;与此同时,把连
续的小写字母串的左侧和右侧的字符串交换位
置;重复该操作,直至没有出现连续相同的小
写字母为止。现在小明想请你帮他完成这种特
殊的翻译。
输入一串由小写字母构成的字符串。(字符串
长度不大于250)
样例一输入:dilhhhhope
样例一输出:opeH4dil
样例二输入:lodnkmgggggggoplerre
样例二输出:eG7lodnkmR2ople

#include<iostream>
#include<cstring>
using namespace std;
struct Word
{
    char str[255];
}phrase[300]; 
int Calculate(int number)
{
    int sum__=0;
    while(number)
    {
        sum__++;
        number/=10;
    }
    return sum__;
}
int main()
{
    char words[255]={'\0'};
    cin >> words;
    int start,sum_,final,i,j,sum=0;//sum用于判定 
    //for(i=0;i<300;i++)
        //phrase[i].str={'\0'};
    strcpy(phrase[0].str,words);//赋值 
    int length=strlen(words),how;
    char recorder;
    while(1)
    {
        i=0;
        sum_=0;
        start=0;
        final=0;
        while(phrase[sum].str[i]!='\0')
        {
            if(phrase[sum].str[i]==phrase[sum].str[i+1]&&phrase[sum].str[i]>='A')//出现重复字符 
            {
                final=start=i;//初始赋值 
                recorder=phrase[sum].str[i]-'a'+'A';//记录字符 
                while(1)
                {
                    if(phrase[sum].str[final]==phrase[sum].str[final+1])final++;
                    else break;
                }
                break;//执行交换字符串操作; 
            }
            i++;
        }
        sum_=final-start;
        if(!sum_)break;
        else//开始交换字符串;
        {
            sum_++;//统计数量 
            j=final+1;
            i=0;
            while(phrase[sum].str[j]!='\0')//将后面部分赋值给 
            {
                phrase[sum+1].str[i]=phrase[sum].str[j];
                i++;j++;
            }
            phrase[sum+1].str[i]=recorder;
            how=Calculate(sum_);//处理数字出现类型 
            if(how==1)
            {
                phrase[sum+1].str[i+1]=sum_+'0';//数字大小得分类讨论 
                i+=2;
            }
            else if(how==2)
            {
                phrase[sum+1].str[i+1]=sum_/10%10+'0';
                phrase[sum+1].str[i+2]=sum_%10+'0';
                i+=3;
            }
            else
            {
                phrase[sum+1].str[i+1]=sum_/100%10+'0';
                phrase[sum+1].str[i+2]=sum_/10%10+'0';
                phrase[sum+1].str[i+3]=sum_%10+'0';
                i+=4;
            }
            j=0;
            while(j!=start)
            {
                phrase[sum+1].str[i]=phrase[sum].str[j];
                i++;j++;
            }
        }
        sum++; 
    }
    cout << phrase[sum].str;
    return 0;
}

本题题意清晰明了即要求将重复字母转
写字母再加上个数字表示重复的数目;

初次设计时忽略考虑sum_的值仅得到40
此时输入样例为z<repeat 26 times>
就会出现端倪重复字母背后不是数字,
这是由于我才用sum_+'0'进行转换形式
由于字符空间限制,就不能直接将9以上
的数字直接转换,所以采用Calculator
进行计算大小;当然本题限制范围250当
超过这个长度就会出现一生之敌运行超

<font face="宋体"size=4就觉得这题还挺有趣挺像镜像反转

猜你喜欢

转载自www.cnblogs.com/pekkasuper/p/12507950.html