【问题标题】:C programming - finding prime numbersC 编程 - 寻找素数
【发布时间】:2014-02-27 07:33:51
【问题描述】:

一个朋友给了我这个代码来找到从 1 到 40 的素数

#include <stdio.h>
#include <conio.h>

void main(void)
{
    clrscr();

//print prime numbers from 1-40

int i, j;
int factor = 0; //this will be 1 if a factor is found
        //otherwise 0
        //so factor = 1 means not a prime number

printf("Prime numbers from 1 to 40 are: ");
for (i = 1; i < 41; i++)
{
    for (j = 2; j <= (i / 2); j++)
    {
        if (factor == 0)
        {
            if (i % j == 0)
                factor = 1;
            else
                factor = 0;
        }
    }
    if (factor != 1)
    {
        printf("%d ", i);
    }
    factor = 0;
}
getch();

}

我没有得到循环的第二部分..为什么 j 以 2 开头,为什么它小于 (i / 2) 而不是 i?

谢谢。

【问题讨论】:

  • 请注意,即使您找到了一个因子,您也会循环到上限。如果您在找到一个循环时打破循环,效率会更高:使用breakj &lt;= (i/2) &amp;&amp; !factor

标签: c++ c numbers


【解决方案1】:

j为什么以2开头

因为 1 是所有数字(包括素数)的因数,因此您无需对此进行测试。 (外循环也应该从 2 开始,因为按照惯例,1 通常不被视为素数。)

为什么它小于(i / 2) 而不是i

没有必要检查大于i 平方根的因数,因为如果有f 这样的因数,也会有一个小于平方根的因数i/f

但是平方根很难计算,所以这个版本使用i/2作为一个更简单但更宽松的上限。它至少和平方根一样大,只要i 至少为 4。

【讨论】:

    【解决方案2】:

    它从 2 开始,因为 2 是最小的素数(1 不被认为是素数)并以 i/2 结束,因为数字 n 的最大因数最多为n/2

    如果它从 1 开始,您将找不到任何素数,因为每个数字都可以被 1 整除。

    至于第二部分,我将使用反证法。假设 n 可以被大于 n/2 的数字 m 整除。那么 n 也可以被 n/m 整除,但 m&gt;n/2 implies2*m > nwhich means that n must be divisible by an integer less than 2, but the only such integer is 1, which would imply thatm=1`。因此 n 在 n/2 和 n 之间不能有除数。

    【讨论】:

    • ..那么为什么当我写 i 而不是 (i / 2) 时,它只打印 1?结果不应该还是一样吗?
    • @user3359196:如果您测试直到并包括 i 的所有数字,那么您将拒绝每个数字,因为每个数字本身都可以整除。跨度>
    • 我应该澄清一下,当我说整数时,我实际上是指自然数。
    【解决方案3】:
    why does j start with 2
    
    What is prime number?
    A prime number (or a prime) is a natural number greater than 1 that has no positive divisors other than 1 and itself. 
    

    注意关键字other than one

    and why is it less than (i / 2) and not i?
    

    素数有一条规则“如果该数不能被该数的两倍以下的平方整除,则它是素数”。 因此,请检查该数字的两倍。

    点击此处了解更多优化

    PRIME NUMBER PROGRAM FOR LARGE NUMBERS WITH 6 EFFICIENCY METHOD HANDLED

    【讨论】:

      【解决方案4】:

      您需要开始查找给定数字是否可以被 2、3、...整除,直到您要查找的数字值的一半。如果一个数可以被任何小于它的数整除而没有余数,则它不是素数。一旦达到数字值的一半,您需要检查其余数字。

      【讨论】:

      • 为什么我们不检查它是否可以被数字的上半部分整除?因为不会有更多的因素了?
      猜你喜欢
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多