OJ 改写整数

描述

小红又给小明出难题了,这次的问题是给小明一些非负整数,让他按照一定的规则编程改写这些整数,规则如下:
如果某个正整数中有n个相同的数字x连续出现,那么将它们改写成“nx”的形式;
对于单独出现的数字x,将其改写成“1x”的形式。
例如,122344111应该改写为1122132431。
由于小明的编码能力太弱,所以请你帮他编程解决这个问题。

输入
输入的第一行是一个正整数n(n<=1000),表示测试数据的组数。
接下来n行,每行输入一个要改写的非负整数,每个整数的位数不超过1000。

输出
对于每组输入,输出改写后的形式。

输入样例 1

3
122344111
1111111111
12345

输出样例 1

1122132431
101
1112131415

分析:此题表达很明确,从左向右依次遍历字符串,若其后无与之相同元素,输出1以及该字符本身;若有与之相同元素,统计个数,将其个数输出以及该字符本身输出。注意,只统计连续相同字符个数,不连续但有重复的字符个数不统计。
思路:由于整数位数较大,通常用字符数组存储。由于每次都是前一个字符与后一个字符判断是否相等,因此,先循环遍历前length-1个字符,最后一个字符单独判断,其中有一些需要注意的细节,可自己通过调试理解。

代码实现:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string a;
    int i,n;
    while(cin>>n)
    {
        while(n--)
        {
            cin>>a;
            int num=1; //不能放在循环里,否则遇到一个字符都是从1开始计数
            for(i=0; i<(int)(a.length()-1); i++)  //从下标为0到下标为length-1
            {
                if(a[i]==a[i+1])
                {
                    num++;
                }
                else
                {
                    cout<<num<<a[i];  //输出num=1
                    num=1;  //保证以后每次num都是以1开始计数
                }
            }
            if(a[a.length()-1]==a[a.length()-2])  //考虑最后一位是否与倒数第二位相等
                cout<<num<<a[a.length()-1];
            else
                cout<<"1"<<a[a.length()-1];
            cout<<endl;
        }
    }
    return 0;
}

如果觉得我的文章对你有帮助有所启发的话,点赞鼓励一下吧!
如果我的文章有错,还望不吝赐教,嘻嘻!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/DJL0718/article/details/107500522
OJ