输出1到1000以内的素数



质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数。

思路:偶数肯定不是素数,所以递增的时候可以以奇数的形式递增,再在奇数中去掉非质数的数。

C++版:

#include<iostream>

using namespace std;
int main()
{
    cout << 3 << " ";
    for (int i = 5;i < 1000;i += 2)
    {
        int j = 0;
        for (j = 2;j<=i / 2;j++)
        {
            if (i%j == 0)
                break;
        }
        if (j - 1 == i / 2)
            cout << i << " ";
    }
    return 0;

}

C语言版:

1、遍历1到1000之间所有数,由于1的特殊性,不是素数也不是合数,所以可以从2开始遍历;

2、对于每一个数,判断是否为素数;

3、如果是素数,则输出,否则继续下一个。

#include <stdio.h>
#include <math.h>
int  isPrime( int  n) //判断素数函数。
{
     int  i;
     for (i = 2; i <= ( int ) sqrt (n); i ++) //从2到算数平方根遍历。
         if (n%i == 0)  return  0; //存在约数,非素数,返回0.
     return  1; //是素数,返回1.
}
int  main()
{
     int  i;
     for (i = 2; i <= 1000; i ++) //遍历。
         if (isPrime(i)) //是素数。
             printf ( "%d " , i); //输出素数。
     return  0;
}

Python版:

计算素数的一个方法是埃氏筛法,它的算法理解起来非常简单:

首先,列出从2开始的所有自然数,构造一个序列:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:

3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:

5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取新序列的第一个数5,然后用5把序列的5的倍数筛掉:

7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

不断筛下去,就可以得到所有的素数。

构造一个从3开始的奇数序列:

>>> def _odd_iter():
 n=1
 while True:
  n=n+2
  yield n

定义一个筛选函数:  
>>> def _not_divisible(n):
 return lambda x:x%n>0

定义生成器,不断返回下一个素数:

>>> def primes():
 yield 2
 it = _odd_iter()
 while True:
  n=next(it)
  yield n
  it = filter(_not_divisible(n),it)

  设置退出条件:
>>> for n in primes():
 if n<1000:
  print(n)
 else:
  break




猜你喜欢

转载自blog.csdn.net/johnny_timmy/article/details/80512549