带分数,算式900(python)

带分数思路来源https://blog.csdn.net/qq_51118755/article/details/122680838

带分数

题目描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714

还可以表示为:100 = 82 + 3546 / 197

注意特征:带分数中,数字 1~9 分别出现且只出现一次(不包含 0 )。

类似这样的带分数,100 有 11 种表示法。

输入描述
从标准输入读入一个正整数 N(N<1000)。

输出描述
程序输出该数字用数码 1~9 不重复不遗漏地组成带分数表示的全部种数。

注意:不要求输出每个表示,只统计有多少表示法!

输入输出样例
示例
输入

100

输出

11

运行限制
最大运行时间:3s
最大运行内存: 64M

分析

  • dfs加全排序问题,容易超时所以要考虑到剪枝!!!

在这里插入图片描述
注意,切割后的全排列会包含a,b,c所有取值结果(这点在剪枝操作中会有神奇的操作)

  • 公式抽象:n = a + b / c
  • 由于n是定值,并且b / c > 0 ,所以n > a,所以len(n) >= len(a),在这里我们就确定了a的最大切割范围。
  • 由a的切割范围我们得到了a,那么b/c就是一个定值。如果我能确认c,b就自动能出来了。但这里注意,切割范围可能依然很大,必须通过一切操作再切割一次。记得:切割后的全排列的会包含a,b,c所有的取值结果,所以我们这里以最后一位数作为c的末位,c的末位知道我们就可以用公式:c*(n-a)%10直接求b的尾数,如果尾数等于0和尾数等于c的末位,那么直接可以continue。
  • 知道b的尾数有什么用呢?可以知道b的切割范围,查找到b的尾数的位置,如果b的尾数在a的切割范围和b的尾数在c的切割范围(其实这个可以不用,因为前面有判断是否等于末位,所以b必然不会在c的切割范围内)
  • 最后就是判断n = a + b / c是否成立了。
  • 以上操作需要拼接所以全排列的时候用字符串比较合适,排列出来的元组可以直接拼接。

运行代码

from itertools import permutations
n = input()
a_len_max = len(n) 
n = int(n)
res = 0
for x in permutations("123456789"): # 所有全排列
    for al in range(a_len_max): # 划定a的范围
        a = int("".join(x[:al+1])) # a
        if a >= n:
            continue
        
        c_last = int(x[-1]) # c末位
        b_last = c_last*(n-a)%10 # b末位
        if b_last == 0 or b_last == c_last:
            continue
        
        b_loc = x.index(str(b_last))
        if b_loc <= al : # 在a的切割范围
            continue

        b = int("".join(x[al+1:b_loc+1]))
        c = int("".join(x[b_loc+1:]))
        if b / c + a == n:
            res+=1
print(res)  

通过截图

在这里插入图片描述

算式900

小明的作业本上有道思考题:

看下面的算式:

  (□□□□-□□□□)*□□=900

其中的小方块代表 0 ~ 9 的数字,这 10 个方块刚好包含了 0 ~ 9 中的所有数字。 注意:0 不能作为某个数字的首位。

小明经过几天的努力,终于做出了答案!如下:

(5012-4987)*36=900

用计算机搜索后,发现还有另外一个解,本题的任务就是:请你算出这另外的一个解。

注意:输出格式需要与示例严格一致; 括号及运算符号不要用中文输入法; 整个算式中不能包含空格。

运行限制
最大运行时间:1s
最大运行内存: 128M

分析

  • 直接搜索即可,全排列yyds

运行代码(以下代码输出所有可能结果,后面取题目要求的结果即可)

from itertools import permutations

nums = [i for i in range(10)]
res = 0
for i in permutations(nums,10):
    if i[0] == 0 or i[4] == 0 or i[8] == 0:
        continue
    i = [str(x) for x in i]
    i = "".join(i)
    if (int(str(i[0:4]))-int(str(i[4:8])))*int(str(i[8:])) == 900:
        print(i)

通过截图

在这里插入图片描述

如有错误,敬请指正,欢迎交流,谢谢♪(・ω・)ノ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值