如何解决尝试解决一个问题,但我编写的代码并没有为大量数字提供输出为什么?
我正在尝试这个问题。
13195 的质因数是 5、7、13 和 29。数 600851475143 的最大质因数是多少?
我写了以下代码:
#include<iostream>
#define num 600851475143
using namespace std;
int isprime(unsigned long long int n)
{
unsigned long long int c=0;
for(unsigned long long int i=2;i<n;i++)
{
if(n%i==0)
{
c++;
break;
}
}
if(c==0)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
unsigned long long int a,i,n=num;
while(n-- && n>1)
{
if(isprime(n)==1 && num%n==0)
{
cout<<n;
break;
}
}
return 0;
}
代码出现的问题是它适用于 13195 和其他小值。但是没有得到 600851475143 的任何输出。谁能解释为什么它不适用于大值,并告诉应该在这些中进行哪些更改以获得正确的输出。
解决方法
以下代码片段来自 c(但在 c++ 中也应该运行得很好):
#include <stdio.h>
#define uIntPrime unsigned long long int
#define uIntPrimeFormat "llu"
uIntPrime findSmallestPrimeFactor(uIntPrime num)
{
uIntPrime limit = num / 2 + 1;
for(uIntPrime i=2; i<limit; i++)
{
if((num % i) == 0)
{
return i;
}
}
return num;
}
uIntPrime findLargestPrimeFactor(uIntPrime num)
{
uIntPrime largestPrimeFactor = 1; // start with the smallest possible value
while (num > 1) {
uIntPrime primeFactor = findSmallestPrimeFactor(num);
if (primeFactor > largestPrimeFactor) largestPrimeFactor = primeFactor;
num = num / primeFactor;
}
return largestPrimeFactor;
}
这是如何工作的?
(第一个函数:)从 2 开始数数意味着您从低端的素因数开始。 (计数时非质数的数字只是不能作为无分数的除数计算出来,同时它们的质数因子分量已经被探测到,因为它们较低。)
(第二个函数:)如果找到一个有效的因子,那么这个因子就会从有问题的数字中取出。因此,可以重复在抽出的数中寻找现在最小的素数。 (条件可能是多余的,因为无论如何首先找到较低的数字 - 但它可能类似于您熟悉的搜索模式 - 就像在最小/最大/其他标准搜索中一样。我现在把它留给你来证明用你自己的主程序测试是对还是错。) 停止条件是关于提取最后一个因子意味着将值除以自身并获得 num 的值。
(当然还有很大的空间可以加快速度!)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。