大数字

时间:2018-04-16 23:39:01

标签: c++ c++11 numeric

程序很简单。用户输入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的有趣答案的问题。

2 个答案:

答案 0 :(得分:2)

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

如果只删除n=10(对浮点类型而不是整数类型进行操作),则可以使代码正常工作到pow()。对于第二次和后续循环迭代,您可以在添加new_val之前将nums[i]乘以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

答案 1 :(得分:0)

请允许我建议针对此问题的不同方法。由于容器会让您无法容纳那些大数字,因此不要将它们作为数字,请尝试使用字符串:

从用户获取数字并将其存储在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,您只需在开头添加验证,而无需处理复杂的容器。