ZeuS
2021-06-01T10:29:26+00:00
[img]https://img.nga.178.com/attachments/mon_202106/08/-7Q2o-c1f0K2hT3cSsg-lc.jpg.medium.jpg[/img]
如最后一题,请编程写出所有可能的四位数。
只有四个珠子。比如数字1,5占1珠子,6,2占2个珠子,3,7占3个珠子,8占4个。总共只有4个珠子。
for x in range(1000,10000)
print(x)
一时懵了有哪个四位数不能表示吗,算盘不就是干这个的
重点是只有四个珠子
不过也还行吧?四个珠子分组还是有限的,穷举也行
[quote][pid=522849445,27114234,1]Reply[/pid] Post by [uid=438416]tuntiankou[/uid] (2021-06-08 18:42):
for x in range(1000,10000)
print(x)[/quote]穷举1111-8000是最简单的。但不是最快的吧,可能要用树。
[quote][pid=522849589,27114234,1]Reply[/pid] Post by [uid=42341735]伯川实验班班Q[/uid] (2021-06-08 18:42):
一时懵了有哪个四位数不能表示吗,算盘不就是干这个的[/quote]只有四个珠子。
前面几位想得简单了
这题目是一定要动4个珠子,但不一定是哪一位的哪个珠子
不是列举全部1000到9999的四位数
[quote][pid=522851118,27114234,1]Reply[/pid] Post by [uid=37215509]葱油月饼[/uid] (2021-06-08 18:47):
穷举1111-8000是最简单的。但不是最快的吧,可能要用树。[/quote]1111不是最小的,最小是1003
一看你们90后就没学过算盘
1需要1
2需要2
3需要3
4需要4
5需要1
6需要2
7需要3
8需要4
9需要5
for i in range(1000,9999):
m5000 = (i/5000)%2
m1000 = (i/1000)%5
....
print(i) if m5000 + m1000 + ... + m1 == 4
先列出所有数字需要的珠数,穷举所有四位数,然后按位计算每个数字需要的珠子数,然后加起来,等于4的输出
枚举一下最高位是几用了多少珠子,然后递归下去搜就行了
这估计在leetcode里也就是个easy吧...
简单的说只需要写一个function,功能是input可以使用的珠子数output所有可能的数字的数组,然后循环调用来加工就行了,如果最多只有4个珠的话甚至连判断超出范围都不用写。
public boolean is(int num){
int z5000 = num/5000;
int z1000 = (num-5000*z5000)/1000;
int z500 = (num-5000*z5000 - 1000*z1000)/500;
int z100 = (num-5000*z5000 - 1000*z1000 - 500*z500)/100;
int z50 = (num-5000*z5000 - 1000*z1000 - 500*z500 - 100*z100)/50;
int z10 = (num-5000*z5000 - 1000*z1000 - 500*z500 - 100*z100 - 50*z50)/10;
int z5 = (num-5000*z5000 - 1000*z1000 - 500*z500 - 100*z100 - 50*z50 - 10*z10)/5;
int z1 = num-5000*z5000 - 1000*z1000 - 500*z500 - 100*z100 - 50*z50 - 10*z10 - 5*z5;
if((z1 + z5 + z10 + z50 + z100 + z500 + z1000 + z5000) == 4)
return true;
return false;
}
四颗算盘珠 分配在四个柱上
1.
1.1 一颗珠子可以表示的数有 1、5
1.2 两颗珠子可以表示的数有 2、6
1.3 三颗珠子可以表示的数有 3、7
1.4 四颗珠子可以表示的数有 4、8
2.
2.1.1四颗珠子在同一柱上 4种情况
0004 0040 0400 4000
2.1.2 每种情况 都有一个两次变量
所以每种情况可以表示2^1个数
比如0004这种情况
只可以表示0004 或0008
所以 共可以表示4*2^1=8个数
2.2.1 三颗珠子在同一柱上 12种情况
1003 0103 0013
1030 0130 0031
1300 0310 0301
3001 3010 3100
2.2.2 每种情况 都有两个两次变量
所以每种情况可以表示2^2个数
比如1003这种情况
可以表示1003 1007 5003 5007
所以 共可以表示12*2^2=48个数
2.3 珠子两两组合 共6种情况
0022 0202 2002
2020 0220
2200
2.3.2 每种情况 都有两个两次变量
所以每种情况可以表示2^2个数
比如0022这种情况
可以表示0022 0026 0062 0066
所以 共可以表示6*2^2=24个数
2.4.1 珠子112形式组合 共12种情况
1102 1012 0112
1120 1021 0121
1210 1201 0211
2110 2101 2011
2.4.2 每种情况 有三个两次变量
每种情况对应2^3=8个数字
比如1102这种情况
可以表示1102 1106 1502 1506 5102 5106 5502 5506
共能表示12*2^3=96个数字
2.5.1 珠子分散在四个柱上 1种情况
1111
2.5.2 每种情况有四个两次变量
可以表示2^4=16个数字
3.共计4+48+24+96+16=188个数字