这次的代码写得不是很好,希望发出来可以起到抛砖引玉的作用。
一、题目及要求
1、题目
题目内容:
我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
2、要求
输入格式:
两个整数,第一个表示n,第二个表示m。
输出格式:
一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
3、样例
输入样例:
2 4
输出样例:
15
二、分析与代码
1、难点分析
1)可以先简化问题进行思考,将题目简化为求1~100之间所有的素数和。
那么可以采用枚举的方法,设定两个变量 i 和 j;i 是需要求出的素数值,j 是用于对 i 进行枚举的变量。最后还需要一个变量 isPrime 对 i 是否为素数进行判断。于是,得到了以下代码。
int i,j;
int sum = 0;
int isPrime;
// i 的范围固定是1~100 设定 i 从 1开始 一直到100
// 偷个懒 设定i 从2开始
for (i=2; i<=100; i++){
// 在每次 i 的循环开始 对 isPrime 初始化
isPrime = 1;
for (j=2; j<i; j++){
//判断 i 是否是素数
//i 是素数成立的条件约是 只能被自身整除
//当i 对一个不等于自己的数取模 结果为0 代表不为素数
if (i%j == 0){
isPrime = 0;
break;
}
}
// i 为素数时 对结果进行求和
if (isPrime == 1){
sum += i;
}
}
2)进一步思考 在达到最终目的之前,还需要解决一个问题:如何求得第n个素数的值?
这一步 可以对上述代码进行小小的修改 就可以实现目的。引用一个 count 变量,对每次循环成功(取到 i 的一个素数值)计数,当 count 的值等于 设定的 n 时,结束循环。此时,i 的结果即为第 n 位的素数值。具体实现代码如下:
int n;
scanf("%d",&n);
int count = 0;
int temp = 0;// 暂存 n 的值 在循环结束后返还给 n
int isPrime;
int i,j;
for (i=2; count != n; i++){
isPrime = 1;
for (j=2; j<i; j++){
if (i%j == 0){
isPrime = 0;
break;
}
}
if (isPrime == 1){
count ++;
temp = i;
}
}
n = temp;
printf("%d",n);
3)最终 只需要将两段代码拼凑起来。
将第二段代码设置为一个函数prime,目的是返回第n个的素数值,并用于第一段代码中的范围设定。我们就得到了最终的答案。
2、代码设计
#include <stdio.h>
//求第n个到第m个素数的和
//如何找到第n个素数?设定一个prime函数求解第n个素数的数值。
int prime(int temp){
int x = temp;//暂存temp的值 用于条件判断
int count = 0;
int isPrime;
int i,j;
for (i=2; count != x; i++){
isPrime = 1;
for (j=2; j<i; j++){
if (i%j == 0){
isPrime = 0;
break;
}
}
if (isPrime == 1){
count ++;
temp = i;
}
}
return temp;
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
n = prime(n);
m = prime(m);
int sum = 0;
int i,j;
int isPrime;
for (i=n; i<=m; i++){
isPrime = 1;
for (j=2; j<i; j++){
if (i%j == 0){
isPrime = 0;
break;
}
}
if (isPrime){
sum += i;
}
}
printf("%d",sum);
return 0;
}