C语言实现抢红包算法

 更新时间:2020年09月25日 08:44:28   作者:LSC的博客  
这篇文章主要为大家详细介绍了C语言抢红包算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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);
}

程序运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++线程池实现代码

    C++线程池实现代码

    C++11中,线程我们可以理解为对应一个thread对象,任务可以理解为要执行的函数,通常是耗时的函数。线程过多或者频繁创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能
    2021-12-12
  • C++中自定义sleep、条件变量sleep实例

    C++中自定义sleep、条件变量sleep实例

    这篇文章主要介绍了C++中自定义sleep、条件变量sleep实例,本文直接给出实例代码并讲解了功能作用和使用方法,需要的朋友可以参考下
    2015-03-03
  • 全面解析C++中的new,operator new与placement new

    全面解析C++中的new,operator new与placement new

    以下是C++中的new,operator new与placement new进行了详细的说明介绍,需要的朋友可以过来参考下
    2013-09-09
  • 深入了解C语言的动态内存管理

    深入了解C语言的动态内存管理

    所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存,本文将用5600字带你深入了解动态内存管理,感兴趣的可以学习一下
    2022-07-07
  • C/C++ assert()函数用法案例总结

    C/C++ assert()函数用法案例总结

    这篇文章主要介绍了C/C++ assert()函数用法案例总结,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • C++产生随机数的几种方法小结

    C++产生随机数的几种方法小结

    本文主要介绍了C++产生随机数的几种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • C++实现四则运算器(带括号)

    C++实现四则运算器(带括号)

    这篇文章主要为大家详细介绍了C++实现四则运算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • c++ string的erase删除方法

    c++ string的erase删除方法

    这篇文章主要介绍了c++ string的erase删除方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C++map,set,multiset,multimap详细解析

    C++map,set,multiset,multimap详细解析

    在C++标准模板库(STL)中,容器分为关联式容器和序列式容器两大类,关联式容器主要包括set、map、multiset和multimap,通过索引来访问元素,本文给大家介绍C++ map,set,multiset,multimap的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • c++中map容器的使用详解

    c++中map容器的使用详解

    这篇文章主要介绍了c++中map容器的使用详解,C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值,需要的朋友可以参考下
    2023-08-08

最新评论