鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

[已解决]Python:每日一题 254

[复制链接]
发表于 2019-10-9 22:09:03 | 显示全部楼层
本帖最后由 __mrsq__ 于 2019-10-9 22:23 编辑

num = int(input('输入一个整数:'))

def is_times3(num):
    if num <= 0:
        return False
    if num % 3 ==0:
        num /= 3
        return is_times3(num)
    elif num ==1:
        return True
    else:
        return False
print(is_times3(num))

递归写法

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-9 22:21:55 | 显示全部楼层    本楼为最佳答案   
def isPowerThree(num):
    if num <= 0:
        return False

    if num == 1:
        return True
    
    while num > 1:
        if not num % 3 == 0:
            return False
        else:
            num /= 3

    return True

if __name__ == '__main__':
    print(isPowerThree(45))

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-9 22:42:53 | 显示全部楼层
本帖最后由 __mrsq__ 于 2019-10-9 22:58 编辑
#增加了一个计算显示具体几次幂的功能,因为递归num1和计数用的n放入函数中每次递归调用都会初始化,所以比较笨的用了两个全局变量

num = int(input('输入一个整数:'))
num1 = num 
n = 0

def is_times3(num):
    global num1
    global n

    if num > 0 and num % 3 == 0:
        n += 1
        num /= 3
        return is_times3(num)

    elif num == 1:
        print(f'{num1}是3的{n}次幂!')
        return True

    else:
        print(f'{num1}不是3的幂次方数!')
        return False

print(is_times3(num))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-9 22:44:26 | 显示全部楼层
本帖最后由 zhou995287902 于 2019-10-11 09:01 编辑
def fun254(num):
    while num > 1:
        num = num /3
    if num == 1:
        return True
    else:
        return False

print(fun254(45))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-9 22:51:33 | 显示全部楼层
import itertools as it

def mi(num):
    return 3 ** num
try:
    guess = int(input("请输入数值进行判断:"))
    for each in it.count(1):
        de = mi(each)
        if de < guess:
            continue
        elif de > guess:
            print("false")
        else:
            print("true")
        break
except (ValueError , TypeError):
    print("不要输入错误的数据哦~~")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-9 23:54:27 | 显示全部楼层
def echo(ss):
        while 1:
                if ss <= 0:
                        return False
                if ss == 1:
                        return True
                if ss % 3 == 0:
                        ss //= 3
                else:
                        return False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 09:17:04 | 显示全部楼层
def func1(X):
        if X == 0:
                print('False')
        elif X == 1:
                print('True')
        elif X % 3 != 0:
                print('False')
        else:
                if (X / 3 == 1):
                        print('True')
                else:
                        return func1(X/3)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 09:18:37 | 显示全部楼层
本帖最后由 776667 于 2019-10-10 09:48 编辑
def fun254(x):
    power = 0
    while True:
        if 3**power > x:
            break
        if 3**power == x:
            return True
        power += 1
    return False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 09:41:39 | 显示全部楼层
zltzlt 发表于 2019-10-9 20:09
没有考虑输入为 0 的情况

没有吗?我运行了一下结果是对的。膜拜大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 10:17:20 | 显示全部楼层
a = input("请输入数字:")
b = int(a)
if b == 0:
    print("False")
else:
    if b % 3 == 0:
        print("Ture")
    else:
        print("False")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 11:11:16 | 显示全部楼层
本帖最后由 wiselin 于 2019-10-10 11:15 编辑
import math
def fun254(s:int):
    while 1:
        try:
            print(int(math.log(s,3))==math.log(s,3))
            break   
        except ValueError:
            print('False')
            break
        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 11:44:24 | 显示全部楼层
def check_number(b):
    if b == 0:
        return False
    else:
        if b % 3 == 0:
            return True
        else:
            return False
a_list = eval(input("请输入列表"))
for each_item in a_list:
    print(check_number(each_item))
a = input("已结束,回车关闭此窗口")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 12:05:17 | 显示全部楼层
def result(nums):
    if nums <= 0:
        nums = False
    elif nums == 1:
        nums = True
    else:
        while nums:
            nums /= 3
            if nums == 1:
                break
        if nums == 1:
            nums = True
        else:
            nums = False
    return nums
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 12:21:56 | 显示全部楼层
令 3^k = n,若 n 是整数,则 n ∈ N* 且 k ∈ N
1. 若 n = 3^k, k ∈ N,则 n 的三进制必是以下之一:1, 10, 100, ... ;问题就转换成了 n 的三进制是否是 1, 10, 100, ...
def f254(n):
    while n > 1:
        if n % 3 != 0:
            break
        n /= 3
    return n == 1

2. 从 3^0 = 1 开始反推
def f254(n):
    t = 1
    while t < n:
        t *= 3
    return t == n

3. 3^k1 % 3^k2 = 0, 0 <= k2 <= k1 且 k1, k2 ∈ N
11,6226,1467=3^19 < 0x7fff ffff < 3^20 => 32 位有符号整型范围内 k1 最大可取 19
def f254(n):
    return n > 0 and 1162261467 % n == 0

4. log(n)/log(3) = log(3^k)/log(3) = klog(3)/log(3) = k
from math import log
def f254(n):
    if n < 1:
        return False
    tmp = log(n) / log(3) # tmp = log(n, 3) 也行
    return abs(round(tmp) - tmp) < 1e-10 # 精度原因,要加上这句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 12:58:45 | 显示全部楼层
def check_number(b):
    if b < 3:
        return False
    else:
        while b / 3 > 1:
            b = b / 3
        if b == 1:
            return True
        else:
            if b % 3 == 0:
                return True
            else:
                return False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 14:01:41 | 显示全部楼层
temp=int(input('输入:'))
n=0
while n <temp:
    if temp==3**n:
        print(True)
        break
    else:
        n+=1
else:
    print(False)

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 16:44:11 | 显示全部楼层
本帖最后由 凌九霄 于 2019-10-10 16:50 编辑
def func(n):
    i = 1
    while 1:
        if 3 ** i > n:
            return False
        elif 3 ** i == n:
            return True
        i += 1
def func(n):
    if n > 0:
        while 1:
            if n % 3 == 0:
                n /= 3
                if n == 1:
                    return True
            else:
                return False
    else:
        return False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 17:09:28 | 显示全部楼层
def 求解(某数):       #既然给定是整数,那么就不会是负数次方
    基数 = 1          #3的0次方
    while 某数 > 基数:#穷举法搜寻,理论上不可能漏掉,就是效率可能低点
        基数 *= 3     #指数加一
    return (某数 == 基数)

if __name__ == '__main__':
    print('例1 输出:', 求解(27))
    print('例2 输出:', 求解(0))
    print('例3 输出:', 求解(9))
    print('例4 输出:', 求解(45))
脑海中第一时间闪过的念头,升级,包含负数次方的版本如下:
def 高级求解(某数):
    基数 = 1          #3的0次方
    if 0 < 某数 < 1:  #负数次方为分数,倒数即为正次幂
        某数 = 1/ 某数
    while 某数 > 基数:#穷举法搜寻,理论上不可能漏掉,就是效率可能低点
        基数 *= 3     #指数加一
    return (某数 == 基数)
if __name__ == '__main__':
    print('例1 输出:', 高级求解(27))
    print('例2 输出:', 高级求解(0))
    print('例3 输出:', 高级求解(9))
    print('例4 输出:', 高级求解(45))
    print('自测 输出:', 高级求解(1/(3**8)))

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-10 18:21:52 | 显示全部楼层
Leify 发表于 2019-10-10 09:41
没有吗?我运行了一下结果是对的。膜拜大佬

他修改了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 19:25:18 | 显示全部楼层

哦哦,好吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 00:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表