找到介于1和N之间的素数

时间:2016-05-06 16:40:36

标签: c algorithm

事实上,我的老师已经通过了计算从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;
}

5 个答案:

答案 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;
}