这是一个在C中查找2到100的素数的程序

时间:2017-09-02 07:02:07

标签: c

我无法理解它是如何工作的。有人可以解释一下这段代码吗?

#include <stdio.h>

int main () {
    /* local variable definition */
    int i, j;

    for(i = 2; i<100; i++) {
        for(j = 2; j <= (i/j); j++) {
            if(!(i%j)) break; // if factor found, not prime
        }
        if(j > (i/j)) printf("%d is prime", i);
    }

    return 0;
}

3 个答案:

答案 0 :(得分:1)

1. #include <stdio.h>是一个标题定义了三种变量类型,几种宏和各种函数,用于执行输入和输出。换句话说,除了下面的代码之外,它基本上是一个C-Library被引用来添加一些其他外部定义的逻辑,比如 size_t 变量,这是的结果例如,sizeof 关键字。 这只是stdio.h标题的一个示例,但您可以在此处看到更多信息:https://www.tutorialspoint.com/c_standard_library/stdio_h.htm

2. int main()整数函数int),它使用不推荐的声明样式main(),这意味着你不应该再这样做了,因为它已被其他函数淘汰,特别是main()函数是一个函数,它接受未指定数量的参数(在这种情况下整数)然后用这些整数运行一些操作。

  1. 接下来,花括号包含int main()函数内的所有逻辑。然后在其中,在int i, j;行上,声明了两个局部变量(ij),以便稍后用作某些整数的占位符插入功能。

  2. 在下面,for(i = 2; i<100; i++)表示有一个循环将i变量设置为 2 ,然后在分号i<100之后只要变量 i 小于100 ,循环就会一次又一次地继续执行。在另一个分号后,i++表示每次循环运行时,变量 i 增加1 。所以它从2开始,然后是3,然后是4等,直到i达到100 并且循环停止执行

  3. 接下来,for(j = 2; j <= (i/j); j++)是第一个循环中的另一个循环,但这次循环使用变量j作为占位符/计数器而不是变量i (前一个循环使用的变量),它以&#34; for(j...&#34;开头的循环开始。 。此循环还将j设置为 2 与周围循环集i相同的方式为2);只要j 小于或等于i 除以 j),循环就会继续执行;并且j每次循环运行时会增加(增加)一个,就像i在围绕此循环的循环中所做的那样。

  4. if(!(i%j)) break; // if factor found, not prime此行表示如果break的剩余部分除以{{1},则也会停止执行(i) } 不等于零。

  5. j此行表示如果if(j > (i/j)) printf("%d is prime", i);大于j 除以 i,则该循环将写入/ < strong>输出文本到stdout(标准输出是标准输出设备,指向表示应用程序的默认输出设备的文件流的指针)。

  6. 最后,最后一行j表示从函数返回最终花括号包含函数逻辑/代码。 return 0;应该返回0(也是EXIT_SUCCESS)以确定程序已成功执行, -1否则(也是EXIT_FAILURE)

    < / LI>

    附加说明 - 我个人见过的每种编程语言中的循环都有一些共同点:

    我。 一个初始计数器,一个循环将初始化(开始计数)的值,在循环的括号内和第一个分号前面。

    II。 测试计数器,每次循环继续时将对其进行评估,如果计算结果为TRUE,则循环将继续,但如果计算结果为false,则循环将结束。这是第一个分号后但第二个分号前的循环部分。

    III。 递增/递减计数器,每次循环运行时,循环增加或减少一些值。在第二个分号后,这是括号内循环的一部分。如果没有增量计数器或测试计数器导致循环在某个点退出/中断,那么这称为无限循环。这在编程中是一件非常糟糕的事情,因为它会导致任何计算机程序崩溃,因为它将无限期地执行和消耗计算资源。不好:)

    免责声明:我实际上并不是用C语言编写的,但这种语言与我使用的编程语言有很多相似之处,我猜这个答案非常接近,如果没有100%正确。很想听听专家C程序员的一些意见!

答案 1 :(得分:0)

您的代码循环遍历从299的所有整数,并将实际数字保存在i

for(i = 2; i<100; i++)

然后,对于每个数字i,代码将再次循环遍历从2(i/j)的所有整数。

for(j = 2; j <= (i/j); j++)

你的循环完成条件在数学上等于j小于i的平方根,因为任何更大的整数j已经包含了{{1}的较小因子}。 (要检查一下,请写一篇论文并重写不等式,以便i是你病情右手边的唯一部分。)

然后检查i是否划分j

i

如果(i%j) j的因子,那么ii为零,因此

j

评估为if (!(i%j)) (因为true被撤销为0false协商了这一点)并且您可以摆脱循环,因为!有一个除数不是i1,因此i不是素数。

另一方面,如果内循环结束,你已经找到了一个素数,因为它只有i1作为除数。

有人说这种强力方法对于大整数来说非常慢(你不会用它破解RSA),但这是否澄清了你的问题?

答案 2 :(得分:0)

#include <stdio.h>

int main () {
    /* local variable definition */
    int i, j;

    // Loop from 2 to 99; i will hold the number we are checking to
    // see if it is prime
    for(i = 2; i<100; i++) {
        // now loop through the numbers checking each one to see if
        // it is a factor of i (if it is, then i isn't prime).  This
        // loop stops when j^2 is greater than or equal to the number
        // we are checking
        for(j = 2; j <= (i/j); j++) {
            // i % j (i modulus j) is 0 iff j is a factor of i.  This
            // if test relies on the fact that 0 is false in C (and 
            // all nonzero values are true)
            if(!(i%j)) break; // if factor found, not prime
        }
        // this tests to see if we exited the above loop by failing
        // the test in the for() statement, or whether we exited the
        // loop via the break statement.  If we made it through all
        // iterations of the loop, then we found no factors, and the
        // number is prime.
        // 
        // note that a \n is missing at the end of the printf format
        // string.  The output will be "2 is prime3 is prime5..."
        if(j > (i/j)) printf("%d is prime", i);
    }

    // returns from main() with a value of 0, which will result in
    // the program exiting with an exit code of 0.  An explicit 
    // exit(0) is better form here, but this is not incorrect.
    return 0;
}