gpt4 book ai didi

C++ 代码输出负值

转载 作者:行者123 更新时间:2023-11-30 01:28:46 25 4
gpt4 key购买 nike

我为拼图类网站编写了一个解决方案。在带有最新 g++ 的 XCode 上,我的代码编译正常。在他们的网站(和键盘)上,我的输出是负面的。谁能帮我理解为什么,因为老实说我很困惑。

#include <iostream>
#include <cmath>
#include <vector>
#include <map>

using namespace std;

vector<int> getAllPrimes(vector<int> primesArray, int n)
{
vector<int> numArray (n+1, 1);

for (int i = 2; i <= n; i++)
{
if (numArray[i] == 1)
{
primesArray.push_back(i);
for (int k = i; k <= n; k+= i)
{
numArray[k] = 0;
}
}
}

return primesArray;
}

int main()
{
long n = 32327;

if (n == 1)
{
printf("%ld\n", n);
return EXIT_SUCCESS;
}


map <int, int> primeMap;
map <int, int>::iterator itr;
vector<int> primesArray;

primesArray = getAllPrimes(primesArray, n);

while(!primesArray.empty())
{
long currPrime = primesArray.back(), curr = currPrime;
while (currPrime <= n)
{
primeMap[curr] += (int)floor(n/currPrime);
currPrime *= curr; //multiply currPrime to add another factor of curr.
}
primesArray.pop_back();
}

//get the number of divisors of n!
long numDivisors = 1;
for (itr=primeMap.begin(); itr != primeMap.end(); itr++)
{
numDivisors *= ((*itr).second*2)+1; //power of each prime + 1, * 2 because you need the number of divisors of the square of n!
numDivisors = numDivisors % 1000007;
}

printf("%ld\n", numDivisors);

return 0;
}

按理说“long n”应该是从标准输入中读取一个1到100万之间的整数,但我只是赋值来模拟一下。

我已经把代码放在键盘里了:http://codepad.org/RpPFuLzX .如您所见,输出是 -596936,而在我的机器上是 656502(这是正确的输出)。到底是怎么回事?

最佳答案

罪魁祸首很可能是 CodePad 和其他站点在 32 位系统上编译,其中 long 是 4 个字节长 ( http://codepad.org/W00vCFIN )。在 OS X 上,一切都默认为 64 位,在那些系统(但不是 Windows)上,long 是 8 个字节长。因此,您在某个时候溢出了计算。

如果您依赖于特定的整数大小,请使用 stdint.h

这是一个符合您预期输出的改编版本,使用 int64_t:http://codepad.org/Owsl3ClR

关于C++ 代码输出负值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7058934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com