题目内容: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;
}
转载于:https://blog.51cto.com/ryanscn/1599256