C 欧拉计划挑战3

C 欧拉计划挑战3,c,C,我的代码有点问题,我不知道是什么。GCC编译它时没有任何警告,但在运行时不会输出任何内容 我正在学习c(这实际上是Euler的问题3,求出最大的素因子600851475143) 这个代码怎么了 #include <stdio.h> int primeCheck(unsigned long input); int main(){ //goal: find largest prime factor of 600851475143 unsigned long goal = 60

我的代码有点问题,我不知道是什么。GCC编译它时没有任何警告,但在运行时不会输出任何内容

我正在学习c(这实际上是Euler的问题3,求出最大的素因子600851475143)

这个代码怎么了

#include <stdio.h>

int primeCheck(unsigned long input);

int main(){
  //goal: find largest prime factor of 600851475143
  unsigned long goal = 600851475143;
  for(unsigned long i = 600851475142; i > 0; i--){
    if(primeCheck(i) == 1 && goal%i == 0)
      printf("\n%lu\n\n", i);
  }

}

int primeCheck(unsigned long input){
  for(unsigned long i = 2; i < input; i++){
    if(input%i == 0)
      return 0;
  }
  return 1;
}
#包括
int primeCheck(无符号长输入);
int main(){
//目标:找到最大的主因子600851475143
未签名的长目标=600851475143;
对于(无符号长i=600851475142;i>0;i--){
如果(primeCheck(i)==1&&目标%i==0)
printf(“\n%lu\n\n”,i);
}
}
int primeCheck(无符号长输入){
for(无符号长i=2;i
您的程序执行时间可能太长。试着用Jerry暗示的更小的数字来验证你的程序


您可能想看看这篇文章:了解更好的算法。

假设您使用的是正确大小的数据结构(关于这一点已经有足够的讨论),那么您的程序执行时间肯定太长了

请注意,除非600851475143本身是素数,否则最大的素数因子不能超过1/3(因为我们可以清楚地看到2肯定不是因子)。这说明,在几乎没有数学运算的情况下,我已经可以告诉您,第一个for循环中的if语句将返回超过4000亿次false,并且您正在对它们中的每一个进行素性检查。我不在乎你用什么算法;你不可能快速进行4000亿次素性检查。即使你交换它来利用短路,你也要做4000亿的可分性检查,这也不是很有效


由于这是Euler项目,我不会透露,但我会给出一个提示:假设你知道一些较小的素因子。您如何使用它来设置最大因子的上限?

OP的代码将使用64位
无符号长
,但需要的时间太长

问题:


primeCheck()
迭代到
i
而不是
i不是600851475143>2^32-1吗?我不认为你能在一个未签名的长文件中存储600851475143。如果您使用无符号的long-long,可能会有所帮助。2^32-1是4294967295。600851475143要大得多。您的程序执行时间可能太长。
int primeCheck(unsigned long input){
  unsigned long q = input;
  // for(unsigned long i = 2; i < input; i++){
  for(unsigned long i = 2; i <= q; i++){
    if(input%i == 0) {
      return 0;
    }
    q = input/i;
  }
  return 1;
}
int main() {
  //goal: find largest prime factor of 600851475143
  unsigned long long goal = 600851475143;
  unsigned long goal_sqroot = (unsigned long) sqrt(goal);

  // In case  `double sqrt(double)` gave a too low `isqrt()` answer ...
  if (goal/goal_sqroot > goal_sqroot) goal_sqroot = goal/goal_sqroot;

  // for(unsigned long i = 600851475142; i > 0; i--){
  for (unsigned long long i = goal_sqroot; i > 1; i--) {
    if (primeCheck(i) == 1 && goal % i == 0)
      printf("%llu\n", i);
  }
}
6857
1471
839
71