Chenyuze24 @ 2025-01-10 22:26:05
小嘉定义一个正整数为“双生数”,当且仅当该正整数的每个数位的相邻数位中,恰好有一个和该数位的数字相同。 已知一个正整数 x(1 ≤ x ≤ 10¹⁰⁰⁰⁰⁰),要求出不小于 x 的最小“双生数”。 输入描述 在一行中输入一个正整数 x,其范围为 1 ≤ x ≤ 10¹⁰⁰⁰⁰⁰。 输出描述 输出一个正整数,代表不小于 x 的最小“双生数”,该数字不包含前导零。 示例 1 输入: 123 输出: 1100 说明:1100 的第一、二个数位相同,第三、四个数位相同,且可以证明这是符合要求的最小双生数。 示例 2 输入: 114514 输出: 115500
by be_the_person @ 2025-01-11 11:45:29
@Chenyuze24 你能不能说一下题目名称?按着你说的做,网上的程序是:(不一定对,建议在编译器里试一下)?
#include <iostream>
#include <string>
bool isTwinborn(const std::string& num) {
int len = num.size();
if (len == 1) return false; // 单个数字不能形成双生数
for (int i = 1; i < len - 1; ++i) {
// 检查当前位是否满足双生条件
if ((num[i] == num[i-1]) == (num[i] == num[i+1])) {
return false;
}
}
// 检查边界情况
if (num[0] != num[1] && (len == 2 || num[1] != num[2])) return false;
if (num[len-1] != num[len-2] && (len == 2 || num[len-2] != num[len-3])) return false;
return true;
}
std::string findNextTwinborn(std::string x) {
while (!isTwinborn(x)) {
// 增加数值
for (int i = x.size() - 1; i >= 0; --i) {
if (x[i] == '9') {
x[i] = '0';
if (i == 0) {
// 如果所有位都是9,则增加一位
x = "1" + x;
}
} else {
x[i]++;
break;
}
}
}
return x;
}
int main() {
std::string x;
std::cin >> x;
std::cout << findNextTwinborn(x) << std::endl;
return 0;
}