事实上,我的老师已经通过了计算从1到N的素数的程序,但是我不理解代码中的一些内容,我想帮忙。
在第18行中,我们有如下:for(j=2; j<=i/2; j++)
,因为j除以2?为什么J从2开始?我和J不应该从1开始?
#include <stdio.h>
int main() {
int i, j, n, isPrime; //isPrime is used as flag variable
/* Reads upper limit to print prime */
printf("Find prime numbers between 1 to : ");
scanf("%d", &n);
printf("\nAll prime numbers between 1 to %d are:\n", n);
/* Finds all Prime numbers between 1 to n */
for(i=2; i<=n; i++) {
/* Assume that the current number is Prime */
isPrime = 1;
/* Check if the current number i is prime or not */
for(j=2; j<=i/2; j++) {
/*
* If i is divisible by any number other than 1 and self
* then it is not prime number
*/
if(i%j==0) {
isPrime = 0;
break;
}
}
/* If the number is prime then print */
if(isPrime==1) {
printf("%d is Prime number\n", i);
}
}
return 0;
}
最佳答案
不应该启动i
…在1号?
是的,i
应该在1
处。考虑到当前代码将不断发展后面的代码可能如下所示。注意注释和代码与合同“1到n之间的数字”匹配。从2开始没有隐含的捷径,但是代码正确地测试了所有数字。
/* Finds all Prime numbers between 1 to n */
for(i=1; i<=n; i++) {
if (IsPrime(i)) {
printf("%d is Prime number\n", i);
}
}
关键是作为一个程序员,你被赋予了“寻找1到n之间的素数”的任务。一个常见的子任务是编写
[1...N]
。当然,如果你把所有东西都编码在一起,bool IsPrime(int i)
可以从i
开始-我们知道2
不是素数。然而,好的编程始于软件架构,这涉及到分而治之。因此,创建一个独立的helper函数来处理所有输入是一个很好的第一步。不应该启动
1
在1号?不,现在代码进入find-a-prime算法,启动
j
将失败。bool IsPrime(int i) {
if (i <= 1) return false; // Cope with negative, 0, and 1.
for (int j=2; j<=i/2; j++) {
if (i%j==0) {
return false;
}
}
return true;
}
当然,我们可以在很多方面优化
j=1
。关于c - 寻找介于1和N之间的质数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37077459/