我无法理解它是如何工作的。有人可以解释一下这段代码吗?
#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;
}
答案 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()
函数是一个函数,它接受未指定数量的参数(在这种情况下整数)然后用这些整数运行一些操作。
接下来,花括号包含int main()
函数内的所有逻辑。然后在其中,在int i, j;
行上,声明了两个局部变量(i
和j
),以便稍后用作某些整数的占位符插入功能。
在下面,for(i = 2; i<100; i++)
表示有一个循环将i
变量设置为 2 ,然后在分号i<100
之后只要变量 i 小于100 ,循环就会一次又一次地继续执行。在另一个分号后,i++
表示每次循环运行时,变量 i 将增加1 。所以它从2开始,然后是3,然后是4等,直到i
达到100 并且循环停止执行。
接下来,for(j = 2; j <= (i/j); j++)
是第一个循环中的另一个循环,但这次循环使用变量j
作为占位符/计数器而不是变量i
(前一个循环使用的变量),它以&#34; for(j...
&#34;开头的循环开始。 。此循环还将j
设置为 2 (与周围循环集i
相同的方式为2);只要j
小于或等于(i
除以 j
),循环就会继续执行;并且j
每次循环运行时会增加(增加)一个,就像i
在围绕此循环的循环中所做的那样。
if(!(i%j)) break; // if factor found, not prime
此行表示如果break
的剩余部分除以{{1},则也会停止执行(i
) } 不等于零。
j
此行表示如果if(j > (i/j)) printf("%d is prime", i);
大于j
除以 i
,则该循环将写入/ < strong>输出文本到stdout(标准输出是标准输出设备,指向表示应用程序的默认输出设备的文件流的指针)。
最后,最后一行j
表示从函数返回,最终花括号包含函数逻辑/代码。 return 0;
也应该返回0(也是EXIT_SUCCESS)以确定程序已成功执行, -1否则(也是EXIT_FAILURE)。
附加说明 - 我个人见过的每种编程语言中的循环都有一些共同点:
我。 一个初始计数器,一个循环将初始化(开始计数)的值,在循环的括号内和第一个分号前面。
II。 测试计数器,每次循环继续时将对其进行评估,如果计算结果为TRUE,则循环将继续,但如果计算结果为false,则循环将结束。这是第一个分号后但第二个分号前的循环部分。
III。 递增/递减计数器,每次循环运行时,循环增加或减少一些值。在第二个分号后,这是括号内循环的一部分。如果没有增量计数器或测试计数器导致循环在某个点退出/中断,那么这称为无限循环。这在编程中是一件非常糟糕的事情,因为它会导致任何计算机程序崩溃,因为它将无限期地执行和消耗计算资源。不好:)
免责声明:我实际上并不是用C语言编写的,但这种语言与我使用的编程语言有很多相似之处,我猜这个答案非常接近,如果没有100%正确。很想听听专家C程序员的一些意见!
答案 1 :(得分:0)
您的代码循环遍历从2
到99
的所有整数,并将实际数字保存在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
的因子,那么i
模i
为零,因此
j
评估为if (!(i%j))
(因为true
被撤销为0
而false
协商了这一点)并且您可以摆脱循环,因为!
有一个除数不是i
或1
,因此i
不是素数。
另一方面,如果内循环结束,你已经找到了一个素数,因为它只有i
和1
作为除数。
有人说这种强力方法对于大整数来说非常慢(你不会用它破解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;
}