程序设计入门C语言-第n个到m个的素数和

这次的代码写得不是很好,希望发出来可以起到抛砖引玉的作用。

一、题目及要求

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; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值