题目内容:http://mooc.study.163.com/learn/ZJU-1000002011#/learn/ojhw?id=1000052000

我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。

现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。


输入格式:

两个整数,第一个表示n,第二个表示m。


输出格式:

一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。


输入样例:

2 4 


输出样例:

15


我的思路:

判断6N-1 和6N+1 是否素数(N>1),可以快速筛掉很多合数。生成一个素数数组prime[ ]。因为6N, 6N+2, 6N+3, 6N+4都肯定是合数。

生成素数时,判断n 是否素数,从2开始直到sqrt(n)+1 是否整除n 即可。


#include <stdio.h>
#include <math.h>
int MAXSIZE = 201;
int isPrime(int n);
int makePrime(int tail,int prime[MAXSIZE]);



int main(){
	
	int prime[MAXSIZE];
	
	int start,end;
	long sum = 0;
	scanf("%d%d",&start,&end);
	//start = 2;
	//end = 200;
	
	makePrime(end,prime);
	for(int i=start;i<=end;i++){
		sum+= prime[i];
	}
	printf("%d",sum);
	
	return 0;	
}


int isPrime(int n){
	double s = sqrt(n);
	for (int k=2;k<s+1;k++){
		if (n%k == 0)
			return 0;
	}
	return 1;
}

int makePrime(int tail,int prime[MAXSIZE]){
	if (tail>MAXSIZE)
		return -1;
		
	prime[0]=0;
	prime[1]=2;
	prime[2]=3;
	int pos = 3;//pos is the position of prime[]
		
	for(int N = 1;pos<=tail;N++){
		if (isPrime(6*N-1)){
			prime[pos]=6*N-1;
			pos++;
		}
		if (isPrime(6*N+1)){
			prime[pos]=6*N+1;
			pos++;
		}						
	} 	
	return 0;
}