C++中的大量问题
Large Number Issues in C++
我正在研究一个相对简单的问题,该问题基于将某个值下的所有素数相加。我编写了一个应该完成此任务的程序。我正在使用长类型变量。当我进入更高的数字(~200/300k)时,我用来跟踪总和的变量变为负值,尽管事实上没有向它添加负值(基于我的知识和我所做的一些测试)。数据类型是否有问题或我缺少某些内容。
我的代码在下面(C++)[Vector 基本上是一个动态数组,以防人们想知道]:
bool checkPrime(int number, vector<long> & primes, int numberOfPrimes) {
for (int i=0; i<numberOfPrimes-1; i++) {
if(number%primes[i]==0) return false;
}
return true;
}
long solveProblem10(int maxNumber) {
long sumOfPrimes=0;
vector<long> primes;
primes.resize(1);
int numberOfPrimes=0;
for (int i=2; i<maxNumber; i++) {
if(checkPrime(i, primes, numberOfPrimes)) {
sumOfPrimes=sumOfPrimes+i;
primes[numberOfPrimes]=long(i);
numberOfPrimes++;
primes.resize(numberOfPrimes+1);
}
}
return sumOfPrimes;
}
整数表示值使用二进制补码,这意味着最高顺序位表示符号。 当您将数字加得足够高时,将设置最高位(整数溢出),并且数字变为负数。
可以通过使用 unsigned long
(32 位,并且可能仍会溢出要求和的值)或使用unsigned long long
(64 位)来解决此问题。
我用来跟踪总和的变量变为负值,尽管事实上没有向它添加负值(基于我的知识和我所做的一些测试)
长整型是有符号整数。在C++和其他较低级别的语言中,整数类型具有固定的大小。当您添加超过它们的最大值时,它们将溢出并环绕为负数。这是由于二进制补码如何工作的行为。
检查有效的整数值:变量。数据类型。
您使用的是 signed long
,通常是 32 位,这意味着 -2kkk - 2kkk,您可以使用 unsigned long
,即 0-4KKK,或使用 64 位(un)signed long long
如果您需要大于 2^64(无符号长整型)的值,则需要使用 Bignum 数学
long
在您的系统上可能只有 32 位 - 使用 uint64_t
作为总和 - 这为您提供了一个保证的 64 位无符号整数。
#include <cstdint>
uint64_t sumOfPrimes=0;
您可以包含标头<cstdint>
并使用类型 std::uintmax_t 而不是 long。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题