【问题标题】:My C code doesn't output anything, or end running我的 C 代码不输出任何内容,或结束运行
【发布时间】:2015-06-30 21:29:18
【问题描述】:

我正在尝试回答这个问题:

13195 的质因数是 5、7、13 和 29。

600851475143 的最大质因数是多少?

这是我的代码:

#include <stdio.h>

int isPrime(long long num)
{
    for (long long k = 1; k < num; k++)
    {
            if (num%k == 0)
                    return 0;
    }

    return 1;
} 
long long num = 600851475143;
int main(void)
{
    long long prime_factor = 0;
    for (long long j = 2; j < num; j++)
    {
            if (num % j == 0 && isPrime(j) == 1)
                    prime_factor = j;
    }

    printf("%lli\n", prime_factor);


}

但由于某种原因,它没有打印任何内容,甚至没有结束。这是什么原因造成的?

【问题讨论】:

  • 您要求它执行的循环的绝对数量。
  • 我想解释一下为什么long long num 是全球性的?
  • 哦,您的代码正在运行。您只是要求它在输出任何内容之前进行许多、许多、许多 计算。蛮力循环不是解决这个特定的 Project Euler 问题的方法。
  • long long num 是全球性的,因为我是一个假人 @iharob
  • 我虽然是 Project Euler 问题,但不确定...

标签: c terminate


【解决方案1】:

这是一种非常低效的求数素因数的方法。

要找到主要因素,您应该:

  1. 创建小于或等于 (number / 2) 的素数的静态列表。
  2. 遍历素数列表中的每个元素并查看每个元素是否 一个人可以平分这个数字。
  3. 将原始数除以质数,并检查最后一个数 再次。

为什么?那么最小的素数是 2。如果这个数不是偶数,那么可以整除任何大于 2 的数的第一个素数是 3。

每个数字都可以通过其质因数来唯一标识。这称为Fundamental Theorem of Arithmetic。这意味着只有一种表示方式,例如15 作为素数的乘积,在本例中为 { 3, 5 }。

但是,任何素数都可以多次除数。例如,49 是两个素数 {7, 7} 的乘积。将原始数字除以其因子之一可以更快地进行后续除法。当数字 == 1 时,您可以在逻辑上停止检查。

【讨论】:

  • 你的数的第一个质因数是 71。提示:有 4 个。
  • 不用上(number / 2),上sqrt(number)就够了。
  • 我有点含糊,抱歉。我不是在谈论寻找素数。我说的是找到一个数字的质因数。要找到 13714 的素因数,我们必须检查到 (13714 / 2) 才能找到素因数 6857。
  • 你会发现第一个2。如果你想检查因素检查2 然后迭代奇数平方根。除此之外,您已经检查了其他因素。
【解决方案2】:

它不打印任何内容,因为它永远不会离开循环,之后会找到唯一可以打印代码中任何内容的行。尝试一个较小的数字,看看它是否结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多