前言
本系列为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语言将其表示出来,对于可以优化的部门或者说是比较独立的部分能不能单独写成一个函数(在执行循环的时候可以快速执行),看看循环中的某些变量是不是可以优化更小(减少运行时间)