【题目链接】
【题目考点】
1. 枚举
2. 输出数字,0占位
在m个字符位置中输出数字n,右对齐,其余部分由0占位:
printf("%0md", n)
;
cout << setfill('0') << setw(m) << n;
【解题思路】
- 枚举对象:a, b, c
- 枚举范围:
a:1角硬币最少0个,最多有n个。
b:2角硬币最少0个,最多有n/2个。
c:5角硬币最少0个,最多有n/5个。 - 判断条件: a + 2 b + 5 c = n a+2b+5c = n a+2b+5c=n
根据题目要求,先让c从小到大遍历,再让b从小到大遍历,最后看a。
【题解代码】
解法1:枚举 三重循环 scanf/printf
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a, b, c, n, k = 1;//k:编号
scanf("%d", &n);
for(c = 0; c <= n/5; ++c)
for(b = 0; b <= n/2; ++b)
for(a = 0; a <= n; ++a)
{
if(a+2*b+5*c == n)
printf("%03d%12d%12d%12d\n", k++, a, b, c);
}
return 0;
}
解法2:枚举 双重循环 cin/cout
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a, b, c, n, k = 1;//k:编号
cin >> n;
for(c = 0; c <= n/5; ++c)
for(b = 0; b <= (n-c*5)/2; ++b)//去掉5角占用的钱数,剩下n-c*5
{
a = n-b*2-c*5;//去掉5角,2角占用的钱数,剩下的钱数就是1角的个数。此处求出的a一定大于等于0
cout << setfill('0') << setw(3) << k++ << setfill(' ') << setw(12) << a << setw(12) << b << setw(12) << c << endl;
}
return 0;
}