通过从最后一个开始按顺序交替添加自然数来查找下一个数字

data structurec++server side programmingprogramming更新于 2025/5/6 13:37:17

如果我们想要存储一个数值巨大的整数,则使用数字字符串来存储数字的值。众所周知,我们不能在计算机中将大于 32 位的数字存储在数据类型为 int 的数值中。因此,为了避免溢出情况,在这个问题中,我们将以数字字符串而不是 int 变量作为输入,以便我们可以在更大规模的数字上解决这个问题。

问题陈述

现在,在这个问题中,我们需要通过从最后一个开始按顺序交替添加自然数来查找以下数字。我们将获得一个数字字符串,并且必须将最终输出作为字符串本身返回。让我们看看应该如何解决这个问题。

让我们借助一些例子来理解这个问题。

输入 − s = "12345678"

输出 − 16375879

解释

  • 首先,我们取最后一位数字'8',并将第一个自然数'1'加到它上面。我们将得到 (8 + 1) = 9 作为新数字字符串的最后一位数字。

  • 然后我们保留'7',因为我们必须交替执行操作。

  • 接下来,我们取'6',并将第二个自然数'2'加到它上面。我们将得到 (6 + 2) = 8 作为新数字字符串的第三位数字。

  • 然后我们将保留'5',因为我们必须交替执行操作。

  • 接下来,我们将取'4'并将第三个自然数'3'添加到它。我们将得到 (4 + 3) = 7 作为新数字字符串的第五位数字。

  • 然后我们将保留'3',因为我们必须交替执行操作。

  • 接下来,我们将取'2'并将自然数'4'添加到它。我们将得到 (2 + 4) = 6 作为新数字字符串的第七位数字。

  • 然后我们将保留'1',因为我们必须交替执行操作。

  • 因此,我们将得到最终的数字字符串"16375879"

输入 − : s = "78930"

输出 − 18231

解释

  • 首先,我们取最后一位数字'0',并将第一个自然数'1'添加到其中。我们将得到 (0 + 1) = 1 作为新数字字符串的最后一位数字。

  • 然后我们将保留'3',因为我们必须交替执行操作。

  • 接下来,我们取'9',并将第二个自然数'2'添加到其中。我们将得到 (9 + 2) = 11

  • 现在,我们需要将这个数字转换为一位数,我们可以通过将其与 9 取模来轻松做到这一点,这将得到'2'作为新数字字符串的第三位数字。

  • 然后我们将保留'8',因为我们必须交替执行操作。

  • 接下来,我们将取'7'并将第三个自然数'3'添加到它。我们将得到 (7 + 3) = 10

  • 现在,我们需要将这个数字转换为一位数,我们可以通过将其与 9 取模来轻松做到这一点,这将得到'1'作为新数字字符串的第五位数字。

  • 因此,我们将得到最终的数字字符串"18231"

问题解释

让我们尝试理解问题并找到其解决方案。在这个问题中,我们得到了一个数字字符串,我们必须在脑海中记住以下条件来改变我们的字符串 -

  • 从最后一个数字开始,在替代数字中添加从 1、2、3 等开始的自然数,直到无穷大。

  • 这意味着如果我们将最后一位数字作为索引 1 的一位数字开始,并保持其余数字不变,我们将改变位于奇数位置的数字。

  • 如果我们在加法后没有得到一位数,我们应该通过不断添加数字直到它变成一位数来使其成为一位数,否则我们可以使用另一种逻辑,将改变后的数字取模为 9,这将给我们相同的值,并在更短的时间内为我们提供一位数。

在下面的文章中,我们将在评论的帮助下理解这种简单的方法在 C++ 的简单代码中给出。

解决方案算法

  • 定义一个临时数字并用"0"初始化 addNum。

  • 定义一个包含最终输出的空字符串。

  • 从字符串后面运行一个循环并将字符转换为整数。

  • 如果数字位于偶数位置,则为不同的数字添加从 1 到无穷大的自然数。

  • 将加法后得到的数字转换为一位数。

  • 将数字转换为字符。

  • 将字符附加到最终输出字符串中。

示例:C++ 代码实现

#include <bits/stdc++.h>
using namespace std;

// 函数通过按顺序在上一个数字的交替索引上添加自然数来查找下一个数字
string Helper(string s){
    // 定义一个临时整数
    // 初始化我们将在数字字符串整数中添加的数字,每次添加 0
    int temp = 0, addNum = 0;
    // 定义空字符串 ans
    string ans = "";
    // 存储数字字符串的长度
    int n = s.size();
    // 启动循环以获取新字符串
    for (int i = n - 1; i >= 0; i--) {
        // 将第 i 个位置的数字以整数形式而不是字符形式存储
        int num = s[i] - '0';
        // 检查位置是否为偶数,如果为偶数则更改数字
        if (temp % 2 == 0) {
            addNum += 1;
            num += addNum;
            // 检查数字是否大于或等于 10
            if (num >= 10) {
                // 如果是,我们需要取 9 的模数使其成为个位数
                num %= 9;
                // 检查个位数是否为 0,并将数字改回 9
                if (num == 0)
                num = 9;
            }
        }
        // 存储结果
        ans = to_string(num) + ans;
        temp += 1;
    }
    // 返回结果
    return ans;
}
int main(){
    // 给出输入的数字字符串
    string s = "12345678";
    // 调用 Helper 函数
    cout << "通过在字符串 " << s << " 上从最后一个开始按顺序交替添加自然数,以下数字为: "<< Helper(s);
    return 0;
}

输出

通过在字符串 12345678 上从最后一个开始按顺序交替添加自然数,以下数字为: 16375879

上述代码的复杂度:

  • 时间复杂度 − O(n); 其中 n 是字符串的长度

  • 空间复杂度 − O(1);在上述代码中,我们没有将任何变量存储在某个数据结构中。

结论

在本文中,通过按顺序将自然数按交替索引从最后一个开始相加来找到以下数字。我们通过对最后一个替代数字应用运算并保留剩余数字来获得解决方案。我们将使用一串数字而不是使用实际数字,这样我们就可以处理具有大值且其中包含越来越多数字的数字。


相关文章