打印复合数的最大素数因子

时间:2017-10-07 11:17:57

标签: c primes

我希望输出如下:

6857
1471
839
71

但我得到的数字甚至不是600851475143的因素。

这段代码有什么问题?

输出应为所有素数,其乘积必须等于600851475143。

#include <stdio.h>
#include <math.h>
#include <time.h>

int temp;
void fact(long a);
int prime(int a);

int main(){ 
    fact(600851475143);
}

void fact(long num){
    for(int i=2; i<sqrt(600851475143); i++){
        if(num%i == 0){
            if(prime(i)){
                printf("%d\n", i);  
                temp=num/i;
                fact(temp);
            }   
        }
    }
}

int prime(int num){

    for(int i=2; i<num; i++){

        if(num % i == 0){
            break;
        }else{
            return i;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您尝试查找其因素的数字超出了长期可以容纳的值范围。Here you can see maximum size of values that data type in c can store。另外,我建议在所有地方使用 long long 要存储的数字来自 num ,即在您的程序中无处不在。确保不要更改数据类型,除非您确定它不会超过其最大限制。 另外,你如何使用

for(int i=2; i<sqrt(600851475143); i++)
C代码中的

?是C ++的功能。

也没有必要
#include <time.h>

所以你的代码应该是这样的:

#include <stdio.h>
#include <math.h>
//#include <time.h>

int temp;
void fact(long long a);
long long prime(long long a);

int main(){
    fact(600851475143);
}

void fact(long long num){
    long long i=2;
    for(; i<sqrt(600851475143); i++){
        if(num%i == 0){
            if(prime(i)){
                printf("%d\n", i);
            }
        }
    }
}

long long prime(long long num){
    long long i=2;
    int k = 1;
    for(; i<num; i++){
        if(num % i == 0){
            k=0;
            break;
        }
    }
    return k;
}

希望它有所帮助。