要求使用桶的算法思想,用c++来写有 4 种卡片 1,6,8,9 ,每种卡片分别有 a,b,c,d 张,要求把这些卡片全部用上组合成一个十进制整数(卡片可以翻转,即 6 和 9 可以互换),使其被 7 整除。若有多种组合方式,输出任意一种即可,无解则输出 −1 。 输入数据 第一行包括四个正整数 a,b,c,d (1≤a,b,c,d≤20000) ,分别代表 1,6,8,9 卡片的个数。 输出数据 输出一个数字——组合的结果。
时间: 2023-08-16 22:08:04 浏览: 73
桶排序算法(C++版)
以下是使用桶的算法思想,用C++实现的代码:
```C++
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int a, b, c, d;
cin >> a >> b >> c >> d;
int cnt[10]; // 用数组来表示桶
memset(cnt, 0, sizeof(cnt)); // 初始化为0
// 将各种卡片的数量存入桶中
cnt[1] = a;
cnt[6] = b;
cnt[8] = c;
cnt[9] = d;
int sum = 0;
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= cnt[i]; j++) {
sum = sum * 10 + i;
}
}
// 判断是否有解
if (sum % 7 != 0) {
// 尝试将6和9互换后再次判断
int tmp = sum;
while (tmp > 0) {
if (tmp % 10 == 6) {
tmp -= 3;
} else if (tmp % 10 == 9) {
tmp += 3;
}
tmp /= 10;
}
if (sum % 7 != 0 && tmp % 7 != 0) {
cout << "-1" << endl;
return 0;
}
}
// 输出任意一种组合方式
cout << sum << endl;
return 0;
}
```
算法思路:
1. 将四种卡片的数量存入桶中,桶的下标为卡片的数字,桶中存储的值为该卡片的数量。
2. 从小到大遍历桶,将各种卡片拼接成一个整数。
3. 判断拼接后的整数是否能被7整除,如果不能,则尝试将6和9互换后再次判断,如果还是不能被7整除,则输出-1。
4. 如果能被7整除,则输出拼接后的整数。
阅读全文