事实上,我的老师已经通过了计算从1到N的素数的程序。但我对代码中的某些内容并不了解,并希望提供帮助。
在第18行,我们有以下内容:for(j=2; j<=i/2; j++)
,因为j除以2?为什么j从2开始?不应该从1开始i和j?
#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;
}
答案 0 :(得分:2)
第一个素数是2 - 这就是你从2开始的原因 - 一切都可以被1整除,如果你从那里开始你的算法会失败。
你以N / 2结尾,因为测试较大的数字不会导致你找不到任何东西,只是因为非素数意味着你必须至少有2个因子,而且最小prime是2和2*(i/2) >= i
- 但实际上停在N的平方根更好更安全(但也许在下一课中)。
从2开始并将循环递增1是浪费的 - 因为除2之外的所有素数都是奇数,最好从3开始并递增2,并且只需要在循环外除以2进行特殊测试
答案 1 :(得分:2)
不应该在1上启动
i
...
是的,i
应 1
。考虑到当前的代码将会发展。以后的代码可能如下所示。请注意,评论和代码符合您的合同&#34; 1和N&#34;之间的数字。从2开始没有隐含的快捷方式,但清晰的代码是正确测试所有数字[1...N]
。
/* Finds all Prime numbers between 1 to n */
for(i=1; i<=n; i++) {
if (IsPrime(i)) {
printf("%d is Prime number\n", i);
}
}
关键是,作为程序员,您将获得任务&#34;在1和N&#34;之间查找素数。一个常见的子任务是编码bool IsPrime(int i)
。当然,如果您将所有内容编码在一起,i
可以从2
开始 - 我们知道 1
不是素数。然而,良好的编程始于软件架构,涉及分而治之。因此,制作一个适用于所有输入的独立辅助函数是一个很好的第一步。
不应该在1上启动
j
...
没有。现在代码已进入其find-a-prime算法,并且启动j=1
将失败。
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;
}
当然,我们可以通过多种方式优化IsPrime()
。
答案 2 :(得分:0)
第一个素数已知为2
,因此没有理由以1
开头。给定数字i
,没有理由尝试将其除以大于其一半的数字,因为结果总是小于2
并且产生0
的商和非{ -zero余数(除非我们将其除以它,这在主要测试中是没有意义的)。
答案 3 :(得分:0)
这是最简单的方法:
#include <iostream>
using namespace std;
int main (){
int first,second;
cout<<"Enter starting of limit";
cin>>first; //First value
cout<<"Enter Ending of limit";
cin>>second; //Second value
L:
if(first < second){ //Checking starts here
if(first % 2 != 0 && first % 5 != 0 || first - 5 == 0 && first % 7 != 0){
cout<<first<<endl;
first++ ;
goto L; //Iteration
}
}
}
答案 4 :(得分:0)
#include<stdio.h>
int main()
{
int num,i,count,n;
printf("Enter max range:");
scanf("%d",&n);
for(num=1; num<=n; num++)
{
count=0;
for(i=2; i<=num/2; i++)
{
if(num%i==0)
{
count++;
break;
}
}
if(count==0 && num!=1)
printf("%d ",num);
}
return 0;
}