【数据结构】编写微信的抢红包算法

 


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;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值