用c++编程实现微信红包程序:给定一个钱数m发红包人数n其中10=m n=200将钱数拆成几个指定的吉利数如166168 168178178188188199520066666660080888888809999999并发出要求要发出n个红包分布比较均匀并尽可能把钱发完最后输出每个人分到的红包数
思路:
-
定义一个函数,用于生成吉利数的数组,该函数返回一个vector
类型的值。 -
定义一个函数,用于计算每个红包的金额,该函数返回一个vector
类型的值。 -
定义一个函数,用于分配红包金额给每个人,该函数返回一个vector
类型的值。 -
在main函数中,读入钱数m和发红包人数n,调用以上三个函数,输出每个人分到的红包数。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <cmath>
using namespace std;
// 生成吉利数的函数
vector<double> generateLuckyNumbers() {
vector<double> luckyNumbers {
1.66, 1.68, 16.8, 1.78, 17.8, 1.88, 18.8, 1.99,
5.20, 0.66, 6.6, 6.66, 0.08, 0.88, 8.8, 8.88,
0.99, 9.9, 9.99
};
return luckyNumbers;
}
// 计算每个红包的金额
vector<double> calculateRedPacketAmounts(double totalAmount, int numPackets) {
vector<double> luckyNumbers = generateLuckyNumbers();
vector<double> amounts;
double sumAmounts = 0;
for (int i = 0; i < numPackets; i++) {
double amount = luckyNumbers[i % luckyNumbers.size()];
amounts.push_back(amount);
sumAmounts += amount;
}
double scale = totalAmount / sumAmounts;
for (int i = 0; i < numPackets; i++) {
amounts[i] *= scale;
}
return amounts;
}
// 分配红包金额给每个人
vector<double> distributeRedPacketAmounts(vector<double> amounts, int numPeople) {
random_device rd;
mt19937 gen(rd());
shuffle(amounts.begin(), amounts.end(), gen);
vector<double> perPersonAmounts(numPeople);
int idx = 0;
for (int i = 0; i < amounts.size(); i++) {
perPersonAmounts[idx++] += amounts[i];
if (idx >= numPeople) {
idx = 0;
}
}
return perPersonAmounts;
}
int main() {
double totalAmount;
int numPackets;
cin >> totalAmount >> numPackets;
vector<double> amounts = calculateRedPacketAmounts(totalAmount, numPackets);
vector<double> perPersonAmounts = distributeRedPacketAmounts(amounts, numPackets);
for (int i = 0; i < perPersonAmounts.size(); i++) {
cout << "Person " << i+1 << " gets " << round(perPersonAmounts[i]) << " yuan." << endl;
}
return 0;
}
``
原文地址: https://www.cveoy.top/t/topic/eEVS 著作权归作者所有。请勿转载和采集!