C++ prime 循环测试以错误的方式执行
C++ prime loop test executes in false manner
我目前正在接受一些挑战并寻找可以做的事情来测试我在 C++ 中的新能力,我决定主要做数学,在这种情况下是欧拉问题。下面是一些代码,用于查找给定数字的最大质因数,但是由于某种原因它没有进入 for 循环,我什至 运行 cout << "Test" << endl;
但它不会打印语句,为什么这个?
#include <iostream>
#include <string>
using namespace std;
int ReturnPFactors(int number)
{
int Factor{};
int thisnum = number;
for (int x = 0; x < thisnum; x++)
{
cout << "Here" << endl;
}
return Factor;
}
bool isPrime(int n)
{
// Corner case
if (n <= 1)
return false;
// Check from 2 to n-1
for (int i = 2; i < n; i++)
if (n % i == 0)
return false;
return true;
}
int main()
{
//should be looking for 6857
int Number = 600851475143;
cout << ReturnPFactors(Number) << endl;
return 0;
}
如果你有任何问题,我会在接下来的 30 分钟左右(从这个 post)开始,然后再睡觉。
600851475143
对于典型环境中的 int
类型来说太大了,它是 32 位长并且最多可以存储 2147483647
。
600851475143
在二进制中是 1000 1011 1110 0101 1000 1001 1110 1010 1100 0111
.
在典型环境中,它被截断为 32 位长:1110 0101 1000 1001 1110 1010 1100 0111
它的最高位是1
,因此在典型环境中它被视为负数。
因此,i < thisnum
变为false,循环体不会被执行。
您应该使用 long long
,它至少是 64 位长,并且 600851475143LL
带有前缀 LL
,代表 long long
。
我目前正在接受一些挑战并寻找可以做的事情来测试我在 C++ 中的新能力,我决定主要做数学,在这种情况下是欧拉问题。下面是一些代码,用于查找给定数字的最大质因数,但是由于某种原因它没有进入 for 循环,我什至 运行 cout << "Test" << endl;
但它不会打印语句,为什么这个?
#include <iostream>
#include <string>
using namespace std;
int ReturnPFactors(int number)
{
int Factor{};
int thisnum = number;
for (int x = 0; x < thisnum; x++)
{
cout << "Here" << endl;
}
return Factor;
}
bool isPrime(int n)
{
// Corner case
if (n <= 1)
return false;
// Check from 2 to n-1
for (int i = 2; i < n; i++)
if (n % i == 0)
return false;
return true;
}
int main()
{
//should be looking for 6857
int Number = 600851475143;
cout << ReturnPFactors(Number) << endl;
return 0;
}
如果你有任何问题,我会在接下来的 30 分钟左右(从这个 post)开始,然后再睡觉。
600851475143
对于典型环境中的 int
类型来说太大了,它是 32 位长并且最多可以存储 2147483647
。
600851475143
在二进制中是 1000 1011 1110 0101 1000 1001 1110 1010 1100 0111
.
在典型环境中,它被截断为 32 位长:1110 0101 1000 1001 1110 1010 1100 0111
它的最高位是1
,因此在典型环境中它被视为负数。
因此,i < thisnum
变为false,循环体不会被执行。
您应该使用 long long
,它至少是 64 位长,并且 600851475143LL
带有前缀 LL
,代表 long long
。