永发信息网

C语言微信红包

答案:1  悬赏:20  手机版
解决时间 2021-12-20 10:41
微信红包
完成模拟微信红包的实现:
1、每个人都要能够领取到红包;
2、每个人领取到的红包金额总和=总金额;
3、每个人领取到的红包金额不等;
4、算法简单;
5、程序代码可读性要强;
6、如果有可能,对算法进行优化,让每个红包差额不要太大,打印出最佳手气者。
最佳答案
#include <stdio.h>
#include <string.h>
#include <time.h>

#define MAX_TOTAL_MONEY 200 //红包的最大金额
#define MIN_PER_PLAYER  1   //一个人抢到的的最小面额1元
#define MAX_PLAYER_CNT (MAX_TOTAL_MONEY/MIN_PER_PLAYER) //最大抢红包的游戏人数

typedef struct player
{
    char *name;//标记玩家 可以不填
    unsigned int money_get;//抢到的红包
}PLAYER_T;

//每个人领取到的红包金额不等 这个要求比较难搞 暂时不考虑
int main(int argc, char *argv[])
{
    unsigned int total_money = 0;    //不考虑角和分 浮点运算比较复杂
    unsigned int player_cnt = 0;
    int on_off = 0;
    int i = 0;
    int j = 0;
    PLAYER_T player[MAX_PLAYER_CNT] = {0};
    PLAYER_T tmp = {0};

    printf("输入红包金额:\n");
    scanf("%u", &total_money);
    printf("输入游戏人数:\n");
    scanf("%u", &player_cnt);
    printf("是否需要减小贫富差距(0为关闭其余为开启):\n");
    scanf("%u", &on_off);

    //不符合规则的输入判断
    if (total_money > MAX_TOTAL_MONEY || 0 == total_money || 0 == player_cnt || player_cnt*MIN_PER_PLAYER > total_money)
    {
        printf("红包金额最小%u元 最大%u元 游戏人数最小1人 最大%u人\n", MIN_PER_PLAYER, MAX_TOTAL_MONEY, MAX_PLAYER_CNT);
        return 0;
    }

    for (i = 0; i < player_cnt; i++)
    {
        //设置随机种子
        srand(time(NULL)+i);
        //根据随机种子获取一个伪随机数作为抢到的红包 并通过余运算使其始终小于total_money
        player[i].money_get = rand()%total_money;

        //限制所有人所能抢到的最大红包为当前金额池的1/5而不是全部
        if (0 != on_off)
        {
            if (total_money > 5)//5块钱以上再限制
            {
                player[i].money_get = rand()%(total_money/5);
            }
        }

        //最后一个人拿所有剩下的红包
        if (player_cnt - 1 == i)
        {
            player[i].money_get = total_money;
        }
        //运气差随机到0元 给你最小面额
        else if (0 == player[i].money_get)
        {
            player[i].money_get = MIN_PER_PLAYER;
        }
        //剩下的要保证每个人能抢到最小面额
        else if (total_money - player[i].money_get < (player_cnt-i-1)*MIN_PER_PLAYER)
        {
            player[i].money_get = total_money - (player_cnt-i-1)*MIN_PER_PLAYER;
        }

        //把抢到的金额从红包池中减掉
        total_money -= player[i].money_get;
        //如果填了name 可以把名字打印出来
        printf("第%d个玩家抢到红包:%u元\n", i+1, player[i].money_get);
    }

    //冒泡排序 找出手气最佳者
    for (i = 0; i < player_cnt; i++)
    {
        for (j = i+1; j < player_cnt; j++)
        {
            if (player[i].money_get < player[j].money_get)
            {
                memcpy(&tmp, &player[j], sizeof(PLAYER_T));
                memcpy(&player[j], &player[i], sizeof(PLAYER_T));
                memcpy(&player[i], &tmp, sizeof(PLAYER_T));
            }
        }
    }
    printf("手气最佳者抢到红包:%u元\n", player[0].money_get);//如果填了name 可以把名字打印出来
    return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
书面表达。(15分)前些年,随着工业的发展,
绵阳市救助管理站办公位置在哪啊?好找么?
不知道为什么一下子觉得心好难过好心塞是什么
明长城东西起止地点是A.西起东洮,东到辽东B.
朝鲜和哪个国家关系最好?
利川市恩施利川国土资源局东城国土资源所怎么
iphone4s越狱后的Cydia有什么用,可以删了吗
— Peter come to&nbs
江油市救助管理站在什么地方啊,我要处理点事
男孩子学什么手艺吃香
索尼ea27ec能把光驱改固态硬盘吗,怎么改。
三台县救助管理站办公地址在什么地方?我要处
本性是什么意思
湖北花鼓戏,俗称花鼓子,是湖北三大地方剧种
北川县救助管理站地址在什么地方?想过去办事
推荐资讯
求把一段中文翻译为泰文(泰国通用的语言)急
再过几年,农村的蔬菜值钱吗?
昆明到普洱多少公里
感悟人类对和平之渴望。我们一共六十几位作家
工行新建南路支行地址有知道的么?有点事想过
单选题西北牧区居民常常食用的食品有:A.水果
水费卡号是七位数,微信交不了
单选题现在,一些用工单位在招工启事中往往都
如果要设计一个绿色环保的机器或机器人,你希
技嘉785gmt-us2h开核教程
山西壶关县有多少处古文化遗址?
老虎和棕熊谁厉害?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?