【C语言|菜鸟教程】100道进阶经典例题详细解答(实例12-判断 101 到 200 之间的素数以及判断素数多种解法)


前言

本系列为C语言菜鸟100道基础经典例题详解刷题系列。每天1题,点滴成长,一起逆袭。


一、题目描述

题目:判断 101 到 200 之间的素数。


二、题目分析

素数就是只能被1和自身整除的大于1的自然数。

三、解题

程序运行代码

#include<stdio.h>
#include<math.h>
int main() {
	int i,j,k,count=0;
	for(i=101; i<201; i++) {
		k=sqrt(i);   //如果i不能被2~√i间任一整数整除,i必定是素数
		for(j=2; j<=k; j++) if(i%j==0) break;
		if(j>k) {
			printf("%d ",i);
			count++;
			// 换行,用 count 计数,每五个数换行
			if(count % 5 == 0) printf("\n");
		}
		//  else printf("%d is  not aprime number",i);
	}
	return 0;
}

程序运行代码优化

#include<stdio.h>
int IsPrime(int m);

int IsPrime(int m){
	int i;  
	int k=(int)sqrt(m);
	for (i=2; i<=k; i++) {	//注意: sqrt(m)> (int)sqrt(m),这样k的值会比原先小。故 是i<=k而不是i<k 
		if(m%i==0) {
			break;
		}
	}
	if(i>k) return 1;
	else return 0;
}
int main() {
	int i,count=0;
	for(i=101; i<201; i++) {
		if(IsPrime(i)) {
			printf("%d ",i);
			count++;
			// 换行,用 count 计数,每五个数换行
			if(count % 5 == 0) printf("\n");
		}
		//  else printf("%d is  not aprime number",i);
	}
	return 0;
}

四、举一反三

1.判断素数

思路:

程序运行代码

#include<stdio.h>
int main() {
	int i,m;
	scanf("%d",&m);
	for (i=2; i<m; i++) { //用2、3、……m-1去试
		if(m%i==0) {
			break;
		}
	}
	if(i==m) printf("是素数");//也可以写成 if(i>=m)   
	else printf("不是素数");
	return 0;
}

程序运行代码优化

我们其实并不需要对[2-m)的全部数进行上述操作,我们可以只对(2~~m/2)的全部数进行上面的操作就可以了,这样可以简化我们的计算范围。

举个例子:4 =2x2=1x4 ,因数 2,2或1,4,每组其中的一个因数不大于自身(4)的1/2。

通过上面例子分析可知,每个数的因数中,其中一个不会超过本身的1/2,所以我们可以利用这个思想对代码进行优化。

#include<stdio.h>
#include<math.h>
int main() {
	int i,m;
	int k=m/2;
	scanf("%d",&m);
	for (i=2; i<=k; i++) {	
		if(m%i==0) {
			break;
		}
	}
	if(i>k) printf("是素数");
	else printf("不是素数");
	return 0;
}

程序运行代码优化进阶

举个例子:16 可以 由1x16,2x8和4x4,得到,因数1,16和2,8和4,4每组其中的一个因数不大于本身(16)的开方(4)。

每个数的因数中,其中一个不会超过本身的开方,这样我们又缩小了我们的计算范围,所以我们可以利用这个思想再次对代码进行优化。

#include<stdio.h>
#include<math.h>
int main() {
	int i,m;
	int k=(int)sqrt(m);
	//相当于int k=(int)sqrt((double)m);自动转换原则:int自动为转换double 
	scanf("%d",&m);
	for (i=2; i<=k; i++) {	//注意: sqrt(m)> (int)sqrt(m),这样k的值会比原先小。故 是i<=k而不是i<k 
		if(m%i==0) {
			break;
		}
	}
	if(i>k) printf("是素数");//注意: sqrt(m)> (int)sqrt(m),这样k的值会比原先小。故 是i>k而不是i==k 
	else printf("不是素数");
	return 0;
}

总结

sqrt函数
C语言中,sqrt函数的头文件是<math.h>(数学头文件),所以我们先要使用“#include”这个宏来包含一个<math.h>的头文件
我们将鼠标光标放置在sqrt函数上我们不难发现sqrt函数的参数是一个double类型(双精度浮点型)的变量,并且返回值的类型也是double类型的(注意:我们在传递参数时需要时刻注意参数的数据类型)。

自动转换和强制转换

本题学到的编程方法
首先判断有哪些知识点,如何通过c语言将其表示出来,对于可以优化的部门或者说是比较独立的部分能不能单独写成一个函数(在执行循环的时候可以快速执行),看看循环中的某些变量是不是可以优化更小(减少运行时间)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是使用 C 语言编写的代码,用于判断 101-200 之间有多少个素数并输出所有素数。 ```c #include <stdio.h> int main() { int i, j, isPrime; int count = 0; // 记录素数个数 for (i = 101; i <= 200; i++) { isPrime = 1; // 假设 i 是素数 for (j = 2; j < i; j++) { if (i % j == 0) // 如果 i 能被 j 整除,则 i 不是素数 { isPrime = 0; break; } } if (isPrime) // 如果 i 是素数,则输出 { printf("%d ", i); count++; } } printf("\n101-200之间共有 %d 个素数", count); return 0; } ``` 该代码通过一个外层循环遍历 101-200 之间的数,对于每个数,内层循环判断它是否为素数。如果是素数,则输出,并将素数个数计数器加 1。最终输出素数个数和所有素数。 ### 回答2: 要使用C语言编写程序来判断101-200之间有多少个素数,并输出所有素数,可以按照以下步骤进行: 1. 定义一个函数`isPrime`来判断一个数是否为素数素数是只能被1和自身整除的大于1的正整数。我们可以使用循环从2到该数的平方根进行判断,如果能找到能整除该数的数,则说明该数不是素数,返回0;否则返回1,表示该数是素数。 2. 在主函数中,使用循环从101200遍历每一个数。对于每个遍历到的数,调用`isPrime`函数进行判断。 3. 在`isPrime`函数中返回值为1时,输出该数,即打印素数。 下面是完整的C语言代码实现: ```c #include <stdio.h> #include <math.h> int isPrime(int num) { if (num <= 1) { return 0; } int i; for (i = 2; i <= sqrt(num); i++) { if (num % i == 0) { return 0; } } return 1; } int main() { int count = 0; int i; printf("101-200之间素数有:\n"); for (i = 101; i <= 200; i++) { if (isPrime(i)) { printf("%d ", i); count++; } } printf("\n"); printf("共有%d个素数。\n", count); return 0; } ``` 运行程序,输出结果如下: ``` 101-200之间素数有: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 共有21个素数。 ``` 程序成功地判断101-200之间素数,并将其输出。 ### 回答3: 要使用C语言判断101-200之间有多少个素数,并输出所有素数,可以按照以下步骤进行: 1. 定义一个函数`is_prime()`,该函数用于判断一个数是否为素数素数是指除了1和本身之外没有其他因数的正整数。该函数接受一个整数参数`num`,返回一个布尔值,表示该数是否为素数。在函数内部,可以使用循环从2开始依次判断num是否可以被2到num-1之间的整数整除,如果可以整除,则不是素数,返回`false`;如果不能整除,则是素数,返回`true`。 2. 在主函数内部,使用循环从101200依次判断每个数是否为素数。如果判断结果为真,则将该数输出,并计数器`count`加一。 3. 最后输出计数器`count`的值,即为101-200之间素数个数。 下面是具体的C语言代码实现: ```c #include <stdio.h> bool is_prime(int num) { for (int i = 2; i < num; i++) { if (num % i == 0) { return false; } } return true; } int main() { int count = 0; for (int num = 101; num <= 200; num++) { if (is_prime(num)) { printf("%d ", num); count++; } } printf("\n"); printf("101-200之间素数个数为:%d\n", count); return 0; } ``` 运行上述代码后,程序会先输出101-200之间的所有素数,然后输出素数的个数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值