在 C++ 中输出非常大的数字

Posted

技术标签:

【中文标题】在 C++ 中输出非常大的数字【英文标题】:Outputting weirdly large number in C++ 【发布时间】:2018-06-19 00:51:40 【问题描述】:

嘿,C++ 新手,正在研究一个简单的问题,该问题采用 Int 序列并输出数字之和,没有最小和最大数字。

如果向量有一个或没有元素,则返回 0。 这是我的代码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int test(vector<int> numbers) 

  typedef vector<int>::size_type vec_sz;
  vec_sz size = numbers.size();


  if (size <= 1) 
    cout << "Vector less than 2" << endl;
    return 0;
   else 
    sort(numbers.begin(), numbers.end());

    int answer;
    for (int i=1; i < size-1; i++) 
        answer += numbers[i];
    
    return answer;

  



int main() 
    vector<int> vec = 2,1,3,4,6,5,7,9,8,10;
    cout << test(vec) << endl;

    vector<int> vec_2 = 1;
    cout << test(vec_2) << endl;


当我运行它时,我会得到以下内容:

3829804
Vector less than 2
0

当向量 > 1 时,为什么我得到一个大得离谱的数字,而它只是应该返回 2-8 的总和?

当我在不检查包含 1 个或更少项目的向量的情况下制作程序时,我没有问题。感谢您的帮助!

【问题讨论】:

局部变量(比如你的函数中的answer)默认是未初始化的。它们的值是不确定的(并且看似随机)。在没有初始化的情况下使用这些变量会导致undefined behavior ..... 所以将int answer 更改为int answer = 0。或者,更好的是,用answer 替换整个逻辑并在循环中添加值,而不是return std::accumulate(numbers.begin(), numbers.end(), 0) 您应该打开编译器的警告,这会指出问题所在。 @Peter - 你是说std::accumulate(numbers.begin()+1, numbers.end()-1, 0)吗?由于必须排除第一个和最后一个。 (最好还是跳过所有的存储和排序,只需在输入结束时从滚动和中减去最小值和最大值)。 【参考方案1】:

answer 在您的函数中初始化,将具有 indeterminate 值。 任何使用都会导致undefined behavior

int answer; // uninitialized
            // answer will have indeterminate value
for (int i=1; i < size-1; i++) 
    answer += numbers[i]; // undefined behavior

return answer;

根据dcl.init/12:

如果为对象指定了 no 初始化程序,则该对象是默认初始化的。 存储具有自动或动态存储持续时间的对象时 得到,对象有一个indeterminate值,

所以只需初始化answer:

int answer = 0;

【讨论】:

【参考方案2】:

尝试在 for 循环之前将答案设置为 0。这应该可以解决问题,因为 APU 正在尝试将一个数字添加到一个未定义的数字。

【讨论】:

以上是关于在 C++ 中输出非常大的数字的主要内容,如果未能解决你的问题,请参考以下文章

php加密一个非常大的数字以产生一个较小的数字

如何计算大 n 的 2^n?

在 C++ 中存储和搜索数字的最佳方法

华为机试真题 C++ 实现猜密码

c++少儿编程--10.逻辑运算符

如何在输出中不包含 NaN 的情况下计算一个非常大的数组?