题目描述
对任意一个数字串,求出它数位上的偶数个数、奇数个数、数位总数,然后拼接起来得到一个新的数字串(不需要去掉前导零),接着对这个新的数字串同样执行上面的步骤,最终一定会得到123,也就是著名的西西弗斯串。
现有一个数字串n,可以对它执行零或正数次上面的步骤,请计算至少需要多少次可以得到西西弗斯串。
输入描述
一个数字串n(长度不超过10^4)。
输出描述
输出让n变为西西弗斯串的步骤数。
样例1
输入
12345
输出
2
解释
12345 => 235 => 123
样例2
输入
99
输出
3
解释
99 => 022 => 303 => 123
正解:
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string nums;//用于存储输入的数字字符串
cin >> nums;
int counter = 0;//用于记录循环的次数
while (nums != "123") {//直到字符串等于"123"为止
int totalLen = nums.length();//首先获取nums的长度totalLen
int oddCount = 0;
for (unsigned i = 0; i < nums.length(); i++) {//nums.length()返回的是一个unsigned int类型的值,这两者类型不同。这种情况可能导致一些意外的问题,将循环变量i的类型改为无符号整数unsigned int
if ((nums[i] - '0') % 2) {//将字符转换为数字后对2取余来判断是否为奇数。
oddCount++;
}
}
int evenCount = totalLen - oddCount;//计算偶数的个数evenCount
nums = to_string(evenCount) + to_string(oddCount) + to_string(totalLen);//将偶数个数、奇数个数和总长度拼接成一个新的字符串赋值给nums
counter++;
}
cout << counter << endl;
return 0;
}
不知道下面我的做法错在哪,没有答案输出
cpp
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100;
string s;
int main(){
cin >> s;
int even = 0;
int odd = 0;
int count = 0;
while(s != "123"){//直到字符串是"123"为止
int len = s.length();
for(int i=0;i<len;i++){
if((s[i] - '0') % 2 == 0){//s[i]是一个字符不是数字,不能直接用s[i] % 2 == 0来判断
even ++;
}
}
odd = len - even;//奇数个数=总长度-偶数个数
s = to_string(even) + to_string(odd) + to_string(len);//实现了将数字转换为字符串并进行字符串拼接的功能
count++;
}
cout << count;
return 0;
}