代码之家  ›  专栏  ›  技术社区  ›  TosinAl

大数字

  •  0
  • TosinAl  · 技术社区  · 6 年前

    程序很简单。用户输入 n N 我尝试在相邻数字之间加零。例如,如果用户输入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 回复  |  直到 6 年前
        1
  •  2
  •   Remy Lebeau    6 年前

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

    可以使您的代码在以下情况下正常工作 n=10 如果您只是删除 pow() (操作浮点类型,而不是整数类型)。对于第二次和后续循环迭代,您可以简单地进行乘法 new_val 添加前增加100 nums[i] :

    #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 将溢出超过的最大值 长的,长的

    Live Demo

    对于这样高的值,需要使用BigNumber库(因为大多数编译器还没有本机128位数字类型)。或者,使用 std::string 而不是 长的,长的 :

    #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

        2
  •  0
  •   Marvel_Maro    6 年前

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

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