怎么做急急急!!!

题目总版

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;
}

|