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