2020-09-13:判断一个正整数是a的b次方,a和b是整数,并且大于等于2,如何求解?
福哥答案2020-09-13:
首先确定b的范围,b的范围一定在[2,logN]里。然后遍历b,求a的范围,如果范围长度等于0,说明这个正整数是a的b次方。
1.遍历b范围。二分法求a,a初始范围是[2,logN]。2的400次方耗时5秒。【有代码】
2.遍历b范围。优化二分法求a,a初始范围是[2,上一次a的结果]。2的10000次方耗时5秒。【有代码】
3.应该有更优化的方案,暂时没想到。【无代码】
因为用到了大整数,所以用python语言编写。代码如下:
#!/usr/bin/python3
import time
from functools import wraps
def _get_sqrt_range(num, right, exp=2):
"""
求num的exp开方,exp是指数,num是结果。求底数。
Args:
num: 大于等于0并且是整数。
right: 大于等于0并且是整数。右边界。
exp: 大于等于0并且是整数。
Returns:
返回元组,表示一个开方范围。
Raises:
IOError: 无错误。
"""
left = 1
if num == 0:
return 0, 0
if num == 1:
return 1, 1
if num == 2 or num == 3:
return 1, 2
while True:
mid = (left + right) // 2
if mid ** exp > num:
right = mid
if left ** exp == num:
return left, left
if left + 1 == right:
return left, right
elif mid ** exp < num:
left = mid
if right ** exp == num:
return right, right
if left + 1 == right:
return left, right
if mid == 1:
return 1, 2
else:
return mid, mid def get_log_range(num, basenum):
"""
求对数范围。
Args:
num: 数,大于等于1并且是整数。
basenum: 底数,大于等于2并且是整数。
Returns:
返回结果。对数范围。
Raises:
IOError: 无错误。
"""
if num == 1:
return 0, 0
else:
n = 0
ism = 0
while num >= basenum:
if ism == 0 and num % basenum != 0:
ism = 1
n += 1
num //= basenum
return n, n + ism def timefn(fn):
"""计算性能的修饰器"""
@wraps(fn)
def measure_time(*args, **kwargs):
t1 = time.time()
result = fn(*args, **kwargs)
t2 = time.time()
print(f"@timefn: {fn.__name__} took {t2 - t1: .5f} s")
return result
return measure_time @timefn
def is_power1(num):
"""
判断n是否是一个数的幂次方形式。
Args:
num: 大于等于0并且是整数。
Returns:
返回结果。true是幂数
Raises:
IOError: 无错误。
"""
if num <= 3:
return False
else:
log_range = get_log_range(num, 2)
if log_range[0] == log_range[1]:
return True
expmax = log_range[0]
expmin = 2
exp = expmin
sqrt = 0
right = 2 ** (1 + log_range[0] // 2)
while exp <= expmax:
sqrt = _get_sqrt_range(num, right, exp)
# right = sqrt[0]#缩小右边界范围
if sqrt[0] == sqrt[1]:
return True
if sqrt == (1, 2):
return False
exp += 1
return False @timefn
def is_power2(num):
"""
判断n是否是一个数的幂次方形式。
Args:
num: 大于等于0并且是整数。
Returns:
返回结果。true是幂数
Raises:
IOError: 无错误。
"""
if num <= 3:
return False
else:
log_range = get_log_range(num, 2)
if log_range[0] == log_range[1]:
return True
expmax = log_range[0]
expmin = 2
exp = expmin
sqrt = 0
right = 2 ** (1 + log_range[0] // 2)
while exp <= expmax:
sqrt = _get_sqrt_range(num, right, exp)
right = sqrt[0] # 缩小右边界范围
if sqrt[0] == sqrt[1]:
return True
if sqrt == (1, 2):
return False
exp += 1
return False if __name__ == "__main__":
print("----2的400次方")
num = 2 ** 400 + 1
print(is_power1(num))
print(is_power2(num))
print("\r\n----2的10000次方")
num = 2 ** 10000 + 1
print(is_power2(num))
执行代码结果如下:
***
[评论](https://user.qzone.qq.com/3182319461/blog/1599951713)
2020-09-13:判断一个正整数是a的b次方,a和b是整数,并且大于等于2,如何求解?的更多相关文章
- 利用预编译解决C/C++重复定义的错误 -2020.09.13
利用预编译解决C/C++重复定义的错误 -2020.09.13 我们现在有main.c和function.h两个文件 main.c #include <stdio.h> #include ...
- 判断一个正整数是否是2的N次方的简洁算法及其证明
在写代码时遇到了“判断一个正整数是否是2的N次方”的问题,不想调用 java.lang 的 Math 类库进行浮点运算,觉得转换为浮点不是个好办法. 遂在网上搜索了一下,发现有人列出来好几种写法,列举 ...
- js 如何判断一个数字是不是2的n次方幂
昨天去面试时,面试官问了一道面试题,说如何判断一个数是不是2的n次方幂,我当时不知道2的n次方幂是什么(糗大发了
- 『转载』判断一个正整数是不是素数,时间复杂度为O(根号n)
原文链接:https://blog.csdn.net/liangdagongjue/article/details/77895170#commentsedit PS:新手上路,实在找不到怎么转载,所以 ...
- 009 Palindrome Number 判断一个正整数是否是回文数
详见:https://leetcode.com/problems/palindrome-number/description/ 实现语言:Java 方法一: class Solution { publ ...
- java中判断一个字符串是否“都为数字”和“是否包含数字”和“截取数字”
在javascript中有一个方法isDigit()使用来判断一个字符串是否都是数字,在java的字符串处理方法中没有这样的方法,觉得常常需要用到,于是上网搜了一下,整理出了两个用正则表达式匹配的判断 ...
- java 判断一个字符串中的数字:是否为数字、是否包含数字、截取数字
题外话: JavaScript中判断一个字符是否为数字,用函数:isDigit(); 一.判断一个字符串是否都为数字 package com.cmc.util; import java.util.re ...
- C语言:判断t所指字符串中的字母是否由连续递增字母组成。-判断一个输入的任何整数n,是否等于某个连续正整数序列之和。-将一副扑克牌编号为1到54,以某种方式洗牌,这种方式是将这副牌分成两半,然后将他们交叉,并始终保持编号1的牌在最上方。
//判断t所指字符串中的字母是否由连续递增字母组成. #include <stdio.h> #include <string.h> void NONO(); int fun( ...
- 【C语言】输入一个正整数,判断其是否为素数
素数的定义: 素数(prime number)又称质数,有无限个. 素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为素数.代码1: #include<stdio.h& ...
- excel批处理_判断一个名称是不是药品
把药品名称导入到sheet1的A字段 # -*- coding: utf-8 -*-"""Created on Fri Dec 9 09:38:58 2016判断一个名 ...
随机推荐
- [复现]陇原战"疫"2021网络安全大赛-PWN
bbbaby 控制__stack_chk_fail,栈溢出 from pwn import * context.os = 'linux' context.log_level = "debug ...
- element中表格中对其解决方法:
element中表格中对其解决方法: 一开始错位的表格的样式: 发现我们设置的align="center"居中没人用 后面是操作列里的按钮影响了它 直接把align里的属性 ...
- 基本的dns命令
打开cmd的方式 win+r 键 输入cmd 管理员方式运行 打开桌面 命令提示符 盘符切换 直接输入要切换的盘 查看当前目录下所有文件 dir 切换目录 cd /d 跨盘 ...
- Docker-界面化
docker-ui docker-ui只能便于我们查看系统的相关信息,镜像或者容器.在界面上做简单的处理,可处理单机版Docker. docker pull uifd/ui-for-docker do ...
- Python gdal读取MODIS遥感影像并结合质量控制QC波段掩膜数据
本文介绍基于Python中GDAL模块,实现MODIS遥感影像数据的读取.计算,并基于质量控制QC波段进行图像掩膜的方法. 前期的文章Python GDAL读取栅格数据并基于质量评估波段QA对 ...
- Javaweb学习笔记第四弹
JDBC API详解 1.DriverManager作用: 1.注册驱动 registerDriver 2.获取数据库连接 getConnection 参数:1.url jdbc:mysql://lo ...
- day09-拦截器&文件上传
拦截器&文件上传 1.拦截器-Interceptor 1.1拦截器概念 拦截器 拦截器(Interceptor):是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行. ...
- 使用 Netty 实现简单的 RPC 框架
Dubbo 底层使用 Netty 作为网络通信框架.[网络传输问题]:相对于传统的 RPC 或者 RMI 等方式的远程服务过程调用采用了同步阻塞IO,当客户端的并发压力或者网络时延增长之后,同步阻塞 ...
- 怎么在php7项目中安装event扩展
今天就跟大家聊聊有关怎么在php7项目中安装event扩展,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获. 安装支持库libevent wget ...
- 随机森林n_estimators 学习曲线
随机森林 单颗树与随机森林的的分对比 # 导入包 from sklearn.datasets import load_wine from sklearn.model_selection import ...