鱼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 | 显示全部楼层    本楼为最佳答案   
  1. def isPowerThree(num):
  2.     if num <= 0:
  3.         return False

  4.     if num == 1:
  5.         return True
  6.    
  7.     while num > 1:
  8.         if not num % 3 == 0:
  9.             return False
  10.         else:
  11.             num /= 3

  12.     return True

  13. if __name__ == '__main__':
  14.     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 编辑
  1. #增加了一个计算显示具体几次幂的功能,因为递归num1和计数用的n放入函数中每次递归调用都会初始化,所以比较笨的用了两个全局变量

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

  5. def is_times3(num):
  6.     global num1
  7.     global n

  8.     if num > 0 and num % 3 == 0:
  9.         n += 1
  10.         num /= 3
  11.         return is_times3(num)

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

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

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2019-10-10 09:18:37 | 显示全部楼层
本帖最后由 776667 于 2019-10-10 09:48 编辑
  1. def fun254(x):
  2.     power = 0
  3.     while True:
  4.         if 3**power > x:
  5.             break
  6.         if 3**power == x:
  7.             return True
  8.         power += 1
  9.     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 编辑
  1. import math
  2. def fun254(s:int):
  3.     while 1:
  4.         try:
  5.             print(int(math.log(s,3))==math.log(s,3))
  6.             break   
  7.         except ValueError:
  8.             print('False')
  9.             break
  10.         
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
  1. def result(nums):
  2.     if nums <= 0:
  3.         nums = False
  4.     elif nums == 1:
  5.         nums = True
  6.     else:
  7.         while nums:
  8.             nums /= 3
  9.             if nums == 1:
  10.                 break
  11.         if nums == 1:
  12.             nums = True
  13.         else:
  14.             nums = False
  15.     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, ...
  1. def f254(n):
  2.     while n > 1:
  3.         if n % 3 != 0:
  4.             break
  5.         n /= 3
  6.     return n == 1
复制代码


2. 从 3^0 = 1 开始反推
  1. def f254(n):
  2.     t = 1
  3.     while t < n:
  4.         t *= 3
  5.     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
  1. def f254(n):
  2.     return n > 0 and 1162261467 % n == 0
复制代码


4. log(n)/log(3) = log(3^k)/log(3) = klog(3)/log(3) = k
  1. from math import log
  2. def f254(n):
  3.     if n < 1:
  4.         return False
  5.     tmp = log(n) / log(3) # tmp = log(n, 3) 也行
  6.     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 | 显示全部楼层
  1. temp=int(input('输入:'))
  2. n=0
  3. while n <temp:
  4.     if temp==3**n:
  5.         print(True)
  6.         break
  7.     else:
  8.         n+=1
  9. else:
  10.     print(False)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-10-10 16:44:11 | 显示全部楼层
本帖最后由 凌九霄 于 2019-10-10 16:50 编辑
  1. def func(n):
  2.     i = 1
  3.     while 1:
  4.         if 3 ** i > n:
  5.             return False
  6.         elif 3 ** i == n:
  7.             return True
  8.         i += 1
复制代码

  1. def func(n):
  2.     if n > 0:
  3.         while 1:
  4.             if n % 3 == 0:
  5.                 n /= 3
  6.                 if n == 1:
  7.                     return True
  8.             else:
  9.                 return False
  10.     else:
  11.         return False
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

  6. if __name__ == '__main__':
  7.     print('例1 输出:', 求解(27))
  8.     print('例2 输出:', 求解(0))
  9.     print('例3 输出:', 求解(9))
  10.     print('例4 输出:', 求解(45))
复制代码

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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