【FOR.1】认识break语句--质数判断
描述
【阅读部分】材料阅读:C++中break语句和continue语句讲解及使用实例)读入第一行一个整数n,第二行有n个整数。若读入的整数是11的倍数则直接退出循环,否则输出这个数
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int n,data; int main(){ cin>>n; for(int i=1;i<=n;i++) { cin>>data; if(data % 11 ==0) break; //如果读入的是11的倍数,则直接结束break上方最近的一个循环 cout<<data<<" "; } cout<<endl; return 0; }
样例输入
6
211 32 55 63 99 71
样例输出
211 32
说明:当读到55(是11的倍数),执行了break ,退出循环,后面的数据也就没机会被读入了
break :是用来退出距它上方最近的一个循环语句
【题目部分】
输入一个整数n,请你判断n是否是质数。
数学上判断一个数是不是质数的定义是:一个数,除了1和它自身外,不能被其他任何数整除的数就是质数。
输入
输入一个整数n
输出
如果是质数则输出yes
否则输出no
输入样例 1
5
输出样例 1
yes
提示
说明:
质数判断是编程里很基础很重要的知识,所以本题花了很大的精力来讲解质数的判断方法和优化方法
这题大家一定要自己理解掌握,要自己会编写
后面会碰到很多质数的题目。
不会做后面会很吃亏的。
来源
lzy
---------------------------------------------------------------------------------------------------------------------------------
思路:
废话不多说,我们开始讲题吧
我们首先要知道质数是什么东西
质数,就是除了1和他自己本身外没有其他因数,比如2的因数只有1和2,除了1和他本身(2),没有其他因数,所以2是质数(0和1都不是质数)
那我们很容易就能想到这样写代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a;//要判断的数字
cin>>a;//读入
bool f=0;//用f表示a是不是质数,f=0表示是质数,f=1表示不是质数
for(int i=2;i<=a-1;i++){
if(a%i==0){//如果a能被2到a-1之间的数字整除,那就说明他不是质数
f=1;//标记为不是质数
}
}
if(a==1||a==0){
cout<<"不是质数";//1和0不是质数
}else{
if(f==0){//0说明是质数
//如果不是质数f就会变成1
//没有变成0就说明是质数
cout<<"是质数";
}else if(f==1){//1说明不是质数
cout<<"不是质数";
}
}
return 0;
}
可是我们非常不满意,这样的代码效率太慢了,如果一个数n是质数,那我们要循环n-2次才能确定他是质数,如果我们要判断一个很大的数,就会非常慢
这里讲一个小知识,这个代码要循环n-2次,我们称这个代码的时间复杂度为O(n-2),括号里的数越大,就越容易超时
那我们要怎么判断呢?
我们看,超时是因为我们判断质数是用了太多次的判断,有什么办法能减少循环次数吗?
我们看:
18 = 1*18 = 2*9 = 3*6
那我们看,我们在判断18能不能被2整除之后,是不是就再判断18能不能被9整除了?为什么?我们想一下,如果18能被2整除,那我们就直接结束循环(运用break,等会儿介绍),就不用判断9了,我们已经确定18不是质数;假如18不能被2整除,那9也不需要判断了,为什么?因为18如果能被9整除,那18/9=2,这样18就会被2整除,但我们判断过2了,所以18能被9整除是不可能的
拓展1:
break语句可以结束最近的循环
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
break;//这个break就只能结束(j=1,j<=n)这个循环(结束最近的循环)
}
}
也就是说,我们可以把一个数字化成多个式子(1*18 2*9 3*6),我们只需要判断式子的第一个数就好了(1、2、3),那我们怎么知道要判断那些数字呢?
举个例子:36=1*36=2*18=3*12=4*9=6*6
我们发现,式子的第一个数字(1、2、3、4、6)最大是6,也就是36的开平方,所以,我们判断质数,只需要判断2到sqrt(36)就好了
拓展2:
sqrt(36)的意思就是计算36的开平方
---------------------------------------------------------------------------------------------------------------------------------
代码:
#include<bits/stdc++.h>
using namespace std;
int n;//n是要判断的数
int b;//b表示n是不是质数
int main(){
cin>>n;
b=1;//1表示是质数(这句就是初始化)
for(int j=2;j<=sqrt(n);j++) {//判断2到sqrt(n)
if(n % j ==0) {//能被整除
b=0;//不是质数,变成0
break;//结束,我们已经确定他不是质数了
}
}
if(n==1) {//如果要判断的数是1
cout<<"no";
}else if(b==1){//如果是质数
cout<<"yes";
}else{
cout<<"no";
}
return 0;
}