【FOR.1】认识break语句--质数判断(c++)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值