我需要找到 13195的主要因素是5,7,13和29。 / *最大是377. * / 600851475143的最大主要因素是什么?
#include<stdio.h>
int main()
{
int i, j = 0;
/*Code works really fine for 13195 or 26*/
long value, large = 600851475143 /*13195*/;
for(value = (large - 1) ; value >= 3; value--)
{
if(large % value == 0)
{
/*printf("I am here \n");*/
if((value % 2 != 0) && (value % 3 != 0) && (value % 5 != 0) && (value % 7 != 0) )
{
j = 1;
break;
}
}
}
if (j == 1)
{
printf("%ld", value);
}
return 0;
}
哪里出错?
答案 0 :(得分:3)
600851475143太大,无法容纳32位整数。您的计算机上long
可能是32位。您需要使用64位类型。确切的数据类型将取决于您的平台,编译器。
您的主要检查代码是错误的。你假设如果事情没有被2,3,5,7分开那么那就是素数。
答案 1 :(得分:3)
这里最重要的一点是你的代码太慢了:即使你修复了其他问题,例如为你的整数使用了错误的数据类型,并尝试了一些绝对不是素数的除数,迭代一个低于10 ^ 11 将无法完成计算机的生命周期非常浪费。
我强烈推荐你read through the example on page 35 of this classic book,Dijkstra带你完成编写打印前1000个素数的程序的过程。这个例子应该为你提供足够的数学直觉来加速你自己的计算,包括你从你试图考虑的数字的平方根开始搜索的部分。
答案 2 :(得分:2)
600851475143可能高于平台long
数据类型的精度。它需要至少40位才能存储。您可以使用它来计算出您有多少位:
#include <limits.h>
printf("my compiler uses %u bits for the long data type\n", (unsigned int) (CHAR_BIT * sizeof (long)));
答案 3 :(得分:1)
#include<stdio.h>
//Euler problem #3
int main(){
long long i, sqi;
long long value, large = 600851475143LL;
long long max = 0LL;
i = 2LL;
sqi = 4LL; //i*i
for(value = large; sqi <= value ; sqi += 2LL * i++ + 1LL){
while(value % i == 0LL){
value /= (max=i);
}
}
if(value != 1LL && value != large){
max = value;
}
if(max == 0LL){
max = large;
}
printf("%lld\n", max);
return 0;
}
答案 4 :(得分:0)
您需要将L
后缀添加到溢出MAX INT的数字中,所以这一行:
long value, large = 600851475143;
应该是:
long value, large = 600851475143L;
// ^
答案 5 :(得分:0)
为了做到这一点,你需要确定该值是素数 - 即没有素因子。
现在你的小段代码检查3/5/7只是不够好 - 你需要检查值是否有任何较低的素因子(例如11/13/17)。
从战略角度来看,如果你想使用这个分析,你需要查看你到目前为止找到的每个素数因子的列表,并在检查前3个素数时检查它们。
更简单(但效率更低)的方法是编写一个IsPrimeFunction()并检查每个除数的素数并存储最大的除数。
答案 6 :(得分:0)
public class LargeFactor{
public static void main(String []args){
long num = 600851475143L;
long largestFact = 0;
long[] factors = new long[2];
for (long i = 2; i * i < num; i++) {
if (num % i == 0) { // It is a divisor
factors[0] = i;
factors[1] = num / i;
for (int k = 0; k < 2; k++) {
boolean isPrime = true;
for (long j = 2; j * j < factors[k]; j++) {
if (factors[k] % j == 0) {
isPrime = false;
break;
}
}
if (isPrime && factors[k] > largestFact) {
largestFact = factors[k];
}
}
}
}
System.out.println(largestFact);
}
}
以上代码利用了这样一个事实:我们只需要在查找因素时检查所有数字,直到平方根。