打印合数的最大质因数

Printing largest prime factor of a composite number

我希望输出是这样的:

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;
        }
    }
}

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

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;
}

希望对您有所帮助。