抢红包算法(c语言版)

1、算法背景:
大家知道,微信拼手气红包和普通红包两种。普通红包每个人抢到的金额是固定的(总额的平均数),拼手气红包是随机金额(每个人抢到的是随机的,差别可能非常大,有的人抢到的是1分,有的抢到的可能是几元、十几元、几十元),目前的抢红包算法只能输入两个参数,即总金额、总人数。

2、算法要求:
现要求同学们设计一个改进的抢红包算法,可以设定总金额(total)、总人数(num)、抢到的最低金额(min)和最高金额(max),这样就可以控制每个抢红包的,抢到的不会太少,也不会太多。
(1) 先用自然语言给出算法设计的思想:
第一步:输入红包金额总金额,红包个数,红包金额最低/最高额度。

第二步:判断带输入数据是否满足算法要求,不满足输出提示信息,并重新输入数据。

第三步:生成一个随时红包金额

第四部:判断红包金额是否满足条件,如果满足,继续生成下一个红包金额,如果不满足在
此生成新的随机红包金额,知道满足条件。

第五步:输出抢红包的过程信息

(2) 进行异常检查与处理;

(3) 给出C语言源代码实现,运行结果展示;

源代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void input();
int range_random_price(int start_price, int end_price);
void redPackets(double Total, int num, double Min_price, double Max_price);

int maxx = 0, maxx_index = -1;

int main()
{
    input();
    return 0;
}


// 数据输入
void input()
{
    double total;
    int num;
    double min_price, max_price;

    printf("请输入以下数据:\n");
    printf("红包总金额: ");
    scanf("%lf", &total);
    putchar('\n');
    printf("红包数量: ");
    scanf("%d", &num);
    putchar('\n');
    printf("红包最低金额: ");
    scanf("%lf", &min_price);
    putchar('\n');
    printf("红包最高金额: ");
    scanf("%lf", &max_price);
    putchar('\n');
    redPackets(total, num, min_price, max_price);
}

// 生成(a, b) 之间的随机数
int range_random_price(int start_price, int end_price)
{
    return rand()%(end_price-start_price+1) +start_price;
}

// total :总金额(元) num:人的个数   min_price max_price :最低/最高金额
void redPackets(double Total, int num, double Min_price, double Max_price)
{
    // 刚开始金额全部扩大100倍转变成整数,最后输出的再除以一百,转变为浮点数
    int total = (int)Total*100;
    int min_price = (int)Min_price*100;
    int max_price = (int)Max_price*100;

    if((total*1.0 / num) - min_price*1.0  < 1e-9)
    {
        printf("您输入的总金额过小,或者抢的红包金额最低限度过大,请重新输入\n");
        input();
        return ;
    }
    printf("抢红包结果如下:\n");
    
    for(int i = 1; i < num; i++)
    {
        int random_price;
        while(1)
        {
            random_price = range_random_price(min_price, max_price);
            //判断剩下的金额是否满足条件
            if((total - random_price)*1.0 / (num - i) - min_price*1.0 >= 1e-9)
                break;
        }

        if(maxx < random_price)
            maxx = random_price, maxx_index = i;
        total -= random_price;// 剩余金额
        printf("第 %d 个人抢到的红包金额为 %.2f, 红包剩余金额为 %.2f\n", i, (double)(random_price/100.0), (double)(total/100.0));
    }


    if(maxx < total)
        maxx = total, maxx_index = num;

    // 输出最后一个人的红包金额
    printf("第 %d 个人抢到的红包金额为 %.2f, 红包剩余金额为 0.00\n", num, (double)(total/100.0));

    printf("运气王是  %d  号\n", maxx_index);
}

程序运行结果:
这里写图片描述

  • 10
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值