我希望输出如下:
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;
}
}
}
答案 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;
}
希望它有所帮助。