问题 G: 贝贝的加密工作

题目

题解:本题利用STL里面的string类C语言中的字符串库函数来解题较为方便
1)交换前后字符可以的操作:使用函数substr(int index,int len) (参数:index截取字符的下标,len截取的长度)来截取原串里面的字符,然后用改变顺序相加即可,
2)将数字转化为字符串:itoa(int value,char * a,int radix)(参数:转化的值,字符指针(所存的字符数组的地址),转化后进制),不用’0’+cnt是为了防止cnt>=10的情况;
3)再次判断是否有相同的小写字母时,要记得判断是不是小写字母,否则有数字“11”等重叠的数字会出错

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main()
{
    string a,b,c;
    cin>>a;
    int flag=1;
    while(flag)
    {
        for(int i=0; i<a.size(); i++)
        {
            int len=a.size();
            int cnt=0;
            int j;
            for(j=i; j<a.size(); j++)
            {
                if(a[j]!=a[i])///说明a[j-1]==a[i]
                {
                    cnt=j-1-i;///所以cnt=j-1-i;
                    break;
                }
            }
            if(j==a.size()) cnt=a.size()-i-1;///注意边界条件,可能一直相同到末尾,没有进if(a[j]!=a[i])的判断导致cnt的值没改变
            if(cnt!=0)
            {
            	///截取前后字符串
                b=a.substr(0,i);
                c=a.substr(j,len-j);
                c.push_back(char(a[i]-32));
                char e[10];
                string d(itoa(cnt+1,e,10));///构造函数,直接使用char型字符串e[]来构造d,方便相加
                c+=d;
                a=c+b;
                break;
            }
            i=j-1;///i赋为a[i],a[j]相等的那个
        }
        flag=0;
        for(int j=0; j<a.size()-1; j++){ if(islower(a[j])&&a[j]==a[j+1]) {flag=1;break;} }///注意a[i]要为小写字母
    }
    cout << a << endl;
    return 0;
}
发布了95 篇原创文章 · 获赞 7 · 访问量 8458

猜你喜欢

转载自blog.csdn.net/Spidy_harker/article/details/100084270