您正在为自动收银机编写程序。用户需要用最少的硬币来改变。编写一个程序,它需要一个金额(比如1.53美元),并给出美国面额的变化--在这种情况下:1 x 1美元纸币,1 x 50美分和3 x 1美分。最短的节目将是赢家。支持其他货币(即英国面额)和不寻常货币(1,2,3美分?)的奖金点。
你有这些美国面额:1美分,5美分,10美分,25美分,50美分,1美元(纸币或硬币),2美元,5美元,10美元。
你有这些英国面值:1便士,2便士,5便士,10便士,20便士,50便士,国标1,国标2,国标5(纸币或硬币),国标10。
发布于 2011-02-07 09:22:10
Sort[IntegerPartitions[Rationalize@#,Infinity,{10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
Length@#1<Length@#2&][[1]]&
用法
%[0.98]
{1/100, 1/100, 1/100, 1/10, 1/10, 1/4, 1/2}
或
Tally@Sort[IntegerPartitions[Rationalize@#,Infinity,
{10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
Length@#1<Length@#2&][[1]]&
(多6字符)
{{1/100, 3}, {1/10, 2}, {1/4, 1}, {1/2, 1}}
对于其他教派,只需更改理性主义表{10,.,5/100,1/100}
发布于 2011-02-07 18:55:50
import std.algorithm,std.conv,std.stdio;void main(string[]args){auto m=args[1].findSplit(".");void p(T,S)(T t,T u,S s){foreach(v;[u,10,5,1]){writefln("%s %s%s",t/v,v,s);t-=(t/v)*v;}}p(to!int(m[0]),20,"");p(to!int(m[2]),25,"/100");}
更清楚:
import std.algorithm,std.conv,std.stdio;
void main(string[] a)
{
auto m = a[1].findSplit(".");
void p(T, S)(T t, T u, S s)
{
foreach(v; [u, 10, 5, 1])
{
writefln("%s %s%s", t / v, v, s);
t -= (t / v) * v;
}
}
p(to!int(m[0]), 20, "");
p(to!int(m[2]), 25, "/100");
}
只处理美元。将该值作为命令行上的浮点值(值必须为1美元以下的前导0)。不接受$作为值的一部分。将每种纸币/硬币的数量输出在一条单独的行上。例如,1.53的投入导致:
0 20
0 10
0 5
1 1
2 25/100
0 10/100
0 5/100
3 1/100
发布于 2017-06-16 00:41:24
#~NumberDecompose~{10,5,2,1,.5,.25,.1,.05,.01}&
输入
1.53
输出
{0,0,0,1,1,0,0,0,3.}
(s=#~NumberDecompose~#2;Row@Flatten@Table[Table[#2[[i]]"+",s[[i]]],{i,Length@s}])&
37.6,{15,7,2.5,1,0.8,0.2,0.01}
15 +15 +7 +0.2 +0.2 +0.2 +
https://codegolf.stackexchange.com/questions/647
复制相似问题