1. 目标
编写微信的红包算法
2. 要求
每个红包不是预先设置好的,而是发红包的时候计算出来的,且每个红包的大小如下:
- Min=0.01
- Max=remain_money / remain_people *2
3. 输入
输入数据为一组或多组,格式为m,n,其中m代表总金额,n代表总红包数
4. 输出
输出数据为每个人抢红包的金额,以及手气最好的人的编号和金额。
5. 样例
30 5
红包总金额 30元
抢红包总人数5人
第1个人抢到了1.84元
第2个人抢到了8.72元
第3个人抢到了11.44元
第4个人抢到了6.09元
第5个人抢到了1.91元
第3个人抢了11.44元,手气最佳
30 1
抢到唯一红包30元
0 0
抢红包结束
6. 代码
//编写微信的红包算法
//提示
//红包不是预先设置好的,而是发红包的时候计算出来的,每个红包的大小如下:
//min = 0.01
//max = remain_money / remain_people * 2
#include<iostream>
#include<cstdio>
#include<time.h>
#include<stdlib.h>
using namespace std;
long long CalValue(long long min,long long max,long long rst_money,long long rst_people)
{
if (rst_people == 1)
{
return rst_money;
}
srand((unsigned)time(NULL));
//确定本次随机范围
long long low = (rst_money - (rst_people - 1)*max) < min ? min : (rst_money - (rst_people - 1)*max);
long long high = (rst_money - (rst_people - 1)*min) > max ? max : (rst_money - (rst_people - 1)*min);
//避免出现不能取整的情况
long long ave = (rst_money / rst_people) > 1 ? (rst_money / rst_people) : 1;
if (high > 2 * ave)
{
high = 2 * ave;
}
//生成随机值
long long ram = rand() % high;
//防止溢出
if (ram < low)
ram = low;
if (ram > high)
ram = high;
return ram;
}
void Grab(long long rst_money, long long rst_people)
{
if (rst_money > 0)
{
if (rst_people == 1)
{
cout << "抢到唯一红包" << rst_money << "元\n";
return;
}
cout << "红包总金额 " << rst_money << "元\n";
cout << "抢红包总人数" << rst_people<<"人\n";
rst_money *= 100;
long long min = 1;
long long max = 20000;
long long ram = 0;
float red_env = 0;
int i = 1;
float luck = 0; //手气最好的红包
int person = 0;
while (rst_people > 0)
{
ram = CalValue(min, max, rst_money, rst_people);
red_env = ram / 100.0;
printf("第%i个人抢到了%.2f元\n", i, red_env);
if (red_env > luck)
{
luck = red_env;
person = i;
}
rst_money -= ram;
rst_people--;
i++;
}
printf("第%d个人抢了%.2f元,手气最佳\n", person, luck);
}
return;
}
int main()
{
long long total_money, total_people = 0;
while (cin >> total_money >> total_people)
{
if (total_money == 0 && total_people == 0)
{
cout << "抢红包结束" << endl;
break;
}
Grab(total_money, total_people);
}
return 0;
}