第十四届蓝桥杯集训——if——配套用法示例

举报
红目香薰 发表于 2023/01/23 16:58:56 2023/01/23
【摘要】 ​ ​编辑第十四届蓝桥杯集训——if——配套用法示例目录第十四届蓝桥杯集训——if——配套用法示例方法1方法2 其它指数幂输入一个数n,判断n是否是2的指数。n的取值范围(0=>n<=​编辑)​​​​题目看着很简单,其实在比较小的数上还是挺容易做的,但是依然要使用循环进行处理。把这个数多次除以2,如果可以整除,是2的指数倍,如果不可以,就不是,但是循环我们还没有学习呢,不能用循环处理,而且利...

 编辑

第十四届蓝桥杯集训——if——配套用法示例


目录

第十四届蓝桥杯集训——if——配套用法示例

方法1

方法2 

其它指数幂




输入一个数n,判断n是否是2的指数。

n的取值范围(0=>n<=2^{31}编辑)​​​​

题目看着很简单,其实在比较小的数上还是挺容易做的,但是依然要使用循环进行处理。

把这个数多次除以2,
如果可以整除,
是2的指数倍,
如果不可以,就不是,

但是循环我们还没有学习呢,不能用循环处理,而且利用这种方式根本无法判断要循环多少次,根据取值范围可以直接套31次循环。每次都循环这么多次,复杂度这就不低了。所以我们尽量用一次判断来解决它。

但是今天我们不使用循环,我们就使用一个【&】符号来判断这个n是否是2的指数。

推理:

有一个数2,这个数是否是2的指数。

2进行二进制处理,得出:【10】,如果【10】&【01】正好等于【00】,我们知道,如果是2的指数那么一定会是100000……的方式。故而我们有,如果二进制的这个数-1与n这个数进行&的位运算结果一定是00000,……,所有我们就可以用一个表达式来计算这个n是否是2的指数了。

方法1

接下来我们上代码:

举例数字1:2二进制:10,有: 10&(10-1)=10&01=00

举例数字2:8二进制:1000,有1000&(1000-1)=1000&0111=0000

后面的数字都是一个逻辑,计算完成后都是0000。

package com.item.action;

import java.util.Scanner;

public class Main {

	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		/**
		 * 举例数字1:2二进制:10,有: 10&(10-1)=10&01=00
		 * 举例数字2:8二进制:1000,有1000&(1000-1)=1000&0111=0000
		 * 后面的数字都是一个逻辑,计算完成后都是0000。
		 */
		if ((n & (n - 1)) == 0) {
			System.out.println(true);
		} else {
			System.out.println(false);
		}
	}
}

输入测试1024,输出结果true。

方法2 

我们利用2的31次幂来直接计算,这种方法的复杂度也是O(1)

package com.item.action;

import java.util.Scanner;

public class Main {

	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		/**
		 * 方法2:利用范围2的31次幂=2,147,483,648,
		 * 注:由于int正值是从0开始计算故而无法正常显示2147483648
		 * 我们需要使用l来表示一下这个数才能正常计算
		 */
		if(2147483648l%n==0) {
			System.out.println(true);
		}else {
			System.out.println(false);
		}
	}
}

输入测试1024,输出结果true。 

其实我们学会第二种方法后,无论是int范围还是long范围的所有数我们就都会判断了。

其它指数幂

例如:判断一个数是否是7的指数。

先计算7在int范围内的最大指数值,在进行对这个数n的取模计算即可。

package com.item.action;

import java.util.Scanner;

public class Main {

	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		/**
		 * 判断一个数是否是7的指数,n取值范围int值内
		 * 7的11次幂就是int值内的最大数。1977326743
		 */
		if(1977326743%n==0) {
			System.out.println(true);
		}else {
			System.out.println(false);
		}
	}
}

输入测试49,输出结果true 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。