记录两个C语言的红包算法 - 神奇石器时代技术研究交流
神奇石器技术研究交流网 - 业务联系QQ:420004208

记录两个C语言的红包算法

  • 内容
  • 相关

花了两天的时间在石器里弄了个发红包LUA,客户端+服务端LUA,算法偷懒是套用某端里自带的一个LUA的算法,结果在测试中发现问题多多。对红包的金额和份数有要求,出现小数则会出现无反应的情况,所以搜寻了下C语言和LUA版的红包算法,特此记录一下。

代码一:

redbag1.png

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

int main()
{
    system("color A");
while(1)
    {
        float a[25];//保存10个红包金额  ==a[0]不要了,为了显示第几个红包
        float total;//总金额
        printf("\t\t\t欢迎使用红包分发系统\n\n\n");
        printf("请输入红包的总额:\n");
        scanf("%f",&total);
        int num;//发出去num个红包
        printf("请输入红包的个数:(1~20之间)\n");
        scanf("%d",&num);
        float min=0.01;//最小金额0.01元
        /*float max=0;//最大金额,金额未确定,先初始化为0  ===作业*/
        int i=0,j;
        float t;//平均值
        float MAX=0;
        float safe_total=0;//跳跃值
        float sum=0;//累计每次领取的红包金额
        srand(time(NULL));//随机种子,与rand是对配对的 每次执行的结果都不一样
        for(i=1;i<num;i++)//循环领取红包 从1-9,共9份
        {
            t=total/(num-i+1); //平均值 全是10元
            safe_total=t*2;//获取跳跃值 20.00元
            a[i]=(rand()%(int)(safe_total*100)+(int)min*100)/100.0+min;//10.5
            total-=a[i];//发出去的剩下红包金额
            sum+=a[i];  //领取的红包金额
            printf("\t\t第%d个红包有%0.2f元\n",i,a[i]);
            if(a[i]>MAX)
            {
                MAX=a[i];
                j=i;
            }
        }
        a[i]=total;
        printf("\t\t第%d个红包有%0.2f元\n\n\n\n",i,a[i]);
        if(total>MAX)
        {
            printf("\t\t第%d个同学是运气王,抢到了0.2f元的金额\n\n\n",num,total);
        }
        else
        {
            printf("\t\t第%d个同学是运气王,抢到了%0.2f元的金额\n\n\n",j,MAX);
        }
        system("pause");
        system("cls");
    }
return 0;
}
代码二:

redbag2.png

#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);
}
先记录一下,回头转成LUA版

版权声明:若无特殊注明,本文皆为《sa60》原创,转载请保留文章出处。

本文链接:记录两个C语言的红包算法 - http://sa60.com/post-177.html

本文标签:

记录两个C语言的红包算法