记录两个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版



