C语言编程问题1(追加高分)

来源:百度知道 编辑:UC知道 时间:2024/07/03 02:34:59
实现用于计算素数的算法。假定我们要找出小于10的所有素数,其中共有2,3,4,5,6,7,8,9,10九个数,然后取走最小的数2并声明它就是素数,然后筛掉2的倍数。重复上面的步骤知道空筛是,就可选出所有素数。
最好可以讲解一下。。

N=你所要求的范围-2
#include<stdio.h>
#define N 100
void main()
{int i,a[N],j;
for(i=0;i<N;i++)
a[i]=i+2;
for(i=0;i<N;i++)
if(a[i]!=0)
{printf("%3d",a[i]);
for(j=i+1;j<N;j++)
if((a[j]%a[i])==0)
a[j]=0;}
}

你所讲的就是筛选法。
用筛选法解题要遵循以下原则:确定范围, 根据条件, 逐个实验, 筛区不符合条件的解. 在实际情况下, 如果不符合条件的元素或集合容易求的, 而确定的范围也有限,则可以优先考虑用筛选法.
下面举一个求某范围内素数例子来说明: 用筛选法求素数时有一个著名的方法叫做Eratosthenes筛选法.
方法大致如下:当求1倒100的素数时, 1不是素数,当然划去, 在2到100内划去2的倍数(不包括2), 再划去3的倍数(不包括3),(由于4已经划去)划去5的倍数,直至划去不超过10的倍数,剩下的就都是素数.需要知道的是在初等数论中有有这样的定理: 合数N的不等于1的最小正因数不大于N的平方根.
对于Redraiment猜想,下面这个代码可以pass,但是是严格来说是不行的,仅仅是因为测试用例的不全面所致,应该还是有好的算法的(看过大虾pass0ms的,汗!),不能这样一个一个的去判断,对于要求100000000以内的素数个数的话就算用该算法法也要6秒多。

#include <iostream>
#include <cmath>
using namespace std;
#define max 10000002
bool a[max+1]; //注意,要用bool型,否则在有的服务器上不能通过
int main()
{
int n,i,s,j,t;
memset(a