c++ - 如何对大数进行质因数分解?
问题描述
我正在尝试解决Project Euler 第三个问题,但是当我尝试使用大数字时,虽然我的代码可以完美地处理小数字,但它并没有给我任何答案。
#include<iostream>
using std :: cout;
using std :: cin;
using std :: endl;
int main()
{
long long int a = 0, bigPrime = 0, smallPrime = 2, prime = 0;
cout << "Please enter a number...!" << endl;
cin >> a;
for(long long int i = 2 ; i < a ; i++)
{
for(long long int c = 2 ; c < i ; c++)
{
if(i % c != 0)
{
prime = i;
}
else
{
prime = 0;
break;
}
}
if(prime > 0 )
{
if(a % prime == 0)
{
bigPrime = prime;
}
}
}
cout << "The biggest prime is = " << bigPrime << endl;
return 0;
}
那是我的错误代码:) 我正在使用 ubuntu linux 和 g++ 我的代码有什么问题,我该如何改进它?
解决方案
您可以使用一个简单的技巧来改进您的程序:
每次找到除数d
时,将您的数字除以d
。
这意味着对于找到的每个除数,您的数字都会变小,从而使剩余部分更容易分解。
作为奖励,这意味着你不需要那么小心只使用素数作为除数。每次找到一个除数,它就是当前数的最小除数,既然是最小除数,它一定是素数。这节省了整个循环级别。
这些因子是按从小到大的顺序提取的,所以最终你拥有的是最高的素因子——这个挑战的答案。
这不是一个快速的算法,但 600851475143 不是一个很大的数字,这个算法不会有问题。
例如(在 ideone 上):
for (long long int d = 2; d * d <= a; d++) {
if (a % d == 0) {
a /= d;
d--; // this is to handle repeated factors
}
}
我也使用了旧d * d <= a
技巧,但您在这里甚至不需要它。如果最高因子很高,它会有所帮助,而在这个例子中它不是。
推荐阅读
- jena - fuseki 可以配置为使用两种不同类型的数据集来创建联合数据集吗?
- javascript - 如何清除 mapbox 地理编码器?
- jaxb - 将 Lombok 与 OpenCSV 和 JAXB 集成
- matrix - 八度矩阵上的替换元素
- delphi - 创建两个查询delphi之间的关系
- java - 在 scala-akka 框架中注释接收参与者变量
- java - SQLite 到 MS SQL 日期时间
- javascript - 文件类型可记录但未定义的属性在尝试从原型函数访问所述属性时返回
- saml - OKTA SAML 集成
- javascript - ol-ext:地图控制栏不显示在地图上