给各位精英出个小学二年级题目引发的编程题。

ZeuS-avatar

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个珠子。
林花孫-avatar

林花孫

我会编程但我不会算盘
Sól-avatar

Sól

那不就+1+1?
Miyoko-avatar

Miyoko

穷举法啦
计算全部4位数
DubzDL-avatar

DubzDL

直接用排列组合做,占坑
Oddie-avatar

Oddie

for x in range(1000,10000)
print(x)
Little_97-avatar

Little_97

一时懵了有哪个四位数不能表示吗,算盘不就是干这个的
JackLee-avatar

JackLee

是不是要跟算盘做对应?
KreekCrafty2-avatar

KreekCrafty2

重点是只有四个珠子
不过也还行吧?四个珠子分组还是有限的,穷举也行
ZeuS-avatar

ZeuS

[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是最简单的。但不是最快的吧,可能要用树。
ZeuS-avatar

ZeuS

[quote][pid=522849589,27114234,1]Reply[/pid] Post by [uid=42341735]伯川实验班班Q[/uid] (2021-06-08 18:42):

一时懵了有哪个四位数不能表示吗,算盘不就是干这个的[/quote]只有四个珠子。
iiTzGamerX-avatar

iiTzGamerX

前面几位想得简单了
这题目是一定要动4个珠子,但不一定是哪一位的哪个珠子
不是列举全部1000到9999的四位数
Raffermogden-avatar

Raffermogden

[quote][pid=522851118,27114234,1]Reply[/pid] Post by [uid=37215509]葱油月饼[/uid] (2021-06-08 18:47):

穷举1111-8000是最简单的。但不是最快的吧,可能要用树。[/quote]1111不是最小的,最小是1003
Miyoko-avatar

Miyoko

一看你们90后就没学过算盘
1需要1
2需要2
3需要3
4需要4
5需要1
6需要2
7需要3
8需要4
9需要5
Swipply-avatar

Swipply

for i in range(1000,9999):
m5000 = (i/5000)%2
m1000 = (i/1000)%5
....
print(i) if m5000 + m1000 + ... + m1 == 4
Cyn-avatar

Cyn

先列出所有数字需要的珠数,穷举所有四位数,然后按位计算每个数字需要的珠子数,然后加起来,等于4的输出
AyooMV-avatar

AyooMV

枚举一下最高位是几用了多少珠子,然后递归下去搜就行了
silverr-avatar

silverr

这估计在leetcode里也就是个easy吧...
简单的说只需要写一个function,功能是input可以使用的珠子数output所有可能的数字的数组,然后循环调用来加工就行了,如果最多只有4个珠的话甚至连判断超出范围都不用写。
Qreau-avatar

Qreau

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;
}
Kloned-avatar

Kloned

四颗算盘珠 分配在四个柱上

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个数字