描述
使用1角、2角、5角硬币组成 n 角钱。
设1角、2角、5角的硬币各用了 a、b、c 个,列出所有可能的 a, b, c 组合。
输出顺序为:先按 c 的值从小到大,若 c 相同则按 b 的值从小到大。
案例
10
输出
001 10 0 0
002 8 1 0
003 6 2 0
004 4 3 0
005 2 4 0
006 0 5 0
007 5 0 1
008 3 1 1
009 1 2 1
010 0 0 2
这道题看着很难,实际上也不简单
我们先得知道这道题的关键是什么
--------------------第一步--------------------
每一种组合方式,和百鸡问题是差不多的。所以用数学方法是可以解的(不要想的太复杂)
假设
1角钱有x份
1角钱就是x - x/2 - x/5份,2角钱就是x/2 - x/5份,5角钱就是x/5份
这就很好写了!
--------------------第二步--------------------
先定义数据
#include<iostream>
using namespace std;
int main()
{
int n,ans=1,a,b,c;
cin >> n;
return 0;
}
其中n表示测试的数据,ans计数,a,b,c分别表示1角,2角,5角
从001开始
--------------------第三步--------------------
接下来我们写双for(双层for)
for(c = 0;c*5<=n;c++)
{
for(b = 0;c*5+b*2<=n;b++)
{
int a = n-c*5-b*2;
//*****//
x++;
}
}
解释一下
因为是从小到大,所以是c,b,a
这边我们不用在写一个 for(会超时),我们直接计算一下
那么//*****//中该填什么呢?
小黑:一个 if 就行啦。
小绿:明明是一个三目运算符!
都错啦,不用那么麻烦。在学习C语言的时候,我们知道printf也是输出的意思
我们直接一个
printf("%03d%12d%12d%12d\n",x,a,b,c);
就行啦!
小黑:?
小绿:?
解释一下:
%03d 是指长度为3的字符串,(空)用“0”占位,d 是整数
%12d 是指长度为12的字符串,(空)用“ ”占位,d是整数
\n 是指换行
每个项目(变量)一一对应
完整代码:
#include<iostream>
using namespace std;
int n,ans=1,a,b,c;
int main()
{
cin >> n;
for(c = 0;c*5<=n;c++)
{
for(b = 0;c*5+b*2<=n;b++)
{
int a = n-c*5-b*2;
printf("%03d%12d%12d%12d\n",ans,a,b,c);
ans++;
}
}
return 0;
}
拜了个拜!