题目内容: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; }