大数字

Large digit numbers

程序很简单。用户输入 nn 数量的数字,我尝试在相邻数字之间添加零。例如,如果用户输入 9(n) 个数字作为 1 2 3 4 5 6 7 8 9(间隔开),程序输出 10203040506070809。该程序适用于最多 n=8 个数字,但我觉得很有趣n=9 位以上的答案。 n 的范围应该是 3<=n<=15 。我的程序如下:

int main()
{
    cout << "\nEnter n and n values: \n";
    int n;
    cin >> n;
    vector<long long>nums;
    int en = n;
    while (en > 0)
    {
        long long x;
        cin >> x;
        nums.push_back(x);
        --en;
    }

    int r = 2 * n - 2;
    long long new_val = 0;
    int j = 0;
    for (int i = 0; i < n; ++i)
    {
        new_val = new_val + nums[i] * (pow(10, r - j));
        j += 2;
    }

    cout << new_val << endl;
}

我不知道如何解决从n=9到n=15的有趣答案问题。

主要问题是 long long 的大小仅为 64 位,因此最多只能容纳 19 位数字。它的最大值是9,223,372,036,854,775,807.

如果您简单地删除 pow()(它在浮点类型上运行,而不是整数类型),则可以使您的代码在 n=10 之前正常工作。对于第二次和后续循环迭代,您可以在添加 nums[i]:

之前简单地将 new_val 乘以 100
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    cout << "\nEnter n and n values: \n";
    int n;
    cin >> n;
    vector<long long> nums;
    int en = n;
    while (en > 0)
    {
        long long x;
        cin >> x;
        nums.push_back(x);
        --en;
    }

    long long new_val = 0;
    if (n > 0)
    {
        new_val = nums[0];
        for (int i = 1; i < n; ++i)
        {
            new_val *= 100;
            new_val += nums[i];
        }
    }

    cout << new_val << endl;
}

Live Demo

但是1020304050607080901是19位,所以n>=11会溢出超过long long的最大值。

Live Demo

对于如此高的值,您需要使用 BigNumber 库(因为大多数编译器还没有原生的 128 位数字类型)。或者,只需使用 std::string 而不是 long long:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    cout << "\nEnter n and n values: \n";
    int n;
    cin >> n;
    vector<int> nums;
    int en = n;
    while (en > 0)
    {
        int x;
        cin >> x;
        nums.push_back(x);
        --en;
    }

    ostringstream new_val;
    if (n > 0)
    {
        new_val << nums[0];
        for (int i = 1; i < n; ++i)
            new_val << '0' << nums[i];
    }

    cout << new_val.str() << endl;
}

Live Demo

请允许我提出解决此问题的不同方法。由于容器会给您带来麻烦,因此请不要将它们作为数字,而是尝试使用字符串:

从用户处获取数字并将其存储在 nums 向量中后,执行以下操作:

string output = "";
char temp;
for (int i = 0; i < nums.size(); i++){
   temp = nums [i] + '0';
   output += temp;
   if (i != (nums.size()-1))
      output += "0";
}
cout << output;

使用这种方法,用户可以输入任意大的数字。如果你希望数字从9到15,你可以简单地在开头添加验证,而不需要处理复杂的容器。