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);
}

程序运行结果:

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

(0)

相关推荐

  • C语言实现随机抢红包功能

    用C语言实现红包发放随机抢红包的功能,这主要是一个随机数的应用与控制.程序运行截图如图下: 代码如下: #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("

  • C语言实现抢红包程序代码精简版

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 其实这是段相当简单的代码,至于为什么还要把它放在博客上呢,主要是针对那些刚入门学编程的同学(或者是对程序感兴趣的同学),一个比较直观的程序(小游戏)或许更能培养他们的兴趣,或是说更能使他们对编程满怀热情.首先我自己也是从那个阶段过来的,对于老师上课讲得知识很迷茫,不知道熟悉一些运算符,语句,结构有什么用,该怎么用,于是自己摸索着找了几个实例练练手,在练习的过程就逐步掌握了老师讲的知识,自己对编程也更感兴趣了.下

  • C语言实现抢红包算法

    本文实例为大家分享了C语言实现抢红包的具体代码,供大家参考,具体内容如下 1.算法背景: 大家知道,微信拼手气红包和普通红包两种.普通红包每个人抢到的金额是固定的(总额的平均数),拼手气红包是随机金额(每个人抢到的是随机的,差别可能非常大,有的人抢到的是1分,有的抢到的可能是几元.十几元.几十元),目前的抢红包算法只能输入两个参数,即总金额.总人数. 2.算法要求: 现要求同学们设计一个改进的抢红包算法,可以设定总金额(total).总人数(num).抢到的最低金额(min)和最高金额(max)

  • 必须知道的C语言八大排序算法(收藏)

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序-直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到

  • go语言睡眠排序算法实例分析

    本文实例讲述了go语言睡眠排序算法.分享给大家供大家参考.具体分析如下: 睡眠排序算法是一个天才程序员发明的,想法很简单,就是针对数组里的不同的数开多个线程,每个线程根据数的大小睡眠,自然睡的时间越长的,数越大,哈哈,搞笑吧,这种算法看起来很荒唐,但实际上很天才,它可以充分利用多核cpu进行计算. 复制代码 代码如下: package main import (     "fmt"     "time" ) func main() {     tab := []in

  • Go语言通过Luhn算法验证信用卡卡号是否有效的方法

    本文实例讲述了Go语言通过Luhn算法验证信用卡卡号是否有效的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "fmt"     "strings" ) const input = `49927398716 49927398717 1234567812345678 1234567812345670` var t = [...]int{0, 2, 4, 6, 8, 1, 3, 5, 7, 9}

  • C语言选择排序算法及实例代码

    选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置) 3  2  4  1(最初, m

  • C语言基本排序算法之桶式排序实例

    本文实例讲述了C语言基本排序算法之桶式排序.分享给大家供大家参考,具体如下: 桶式排序是对一个有n个整型元素的数组a[n],其中对任意i,0 <= a[i] <= m的特殊排序算法. 可以对 n==m, n != m分别处理.写代码时需要注意的的是a[i]是访问第i-1个元素,而非第i个. /************************************************************************************/ /* Bucket_Sort.h

  • C语言基本排序算法之shell排序实例

    本文实例讲述了C语言基本排序算法之shell排序.分享给大家供大家参考,具体如下: shell排序是对直接插入方法的改进方法. /*------------------------------------------------------------------------------------- Shell_sort.h shell排序是对直接插入方法的改进,它并不是对相邻元素进行比较,而是对一定间隔的元素比较. 选择增量序列的几种方法:(为方便,本例采用第一种增量序列) 1. h[1]=

  • C语言基本排序算法之插入排序与直接选择排序实现方法

    本文实例讲述了C语言基本排序算法之插入排序与直接选择排序实现方法.分享给大家供大家参考,具体如下: 声明待排序元素类型 /*-------------------------- typedef.h 方便修改待排序元素类型 -------------------------------------*/ #ifndef TYPEDEF_H #define TYPEDEF_H typedef int T; #endif 插入排序: /*---------------------------------

  • C语言 奇偶排序算法详解及实例代码

    C语言奇偶排序算法 奇偶排序,或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算.这是与冒泡排序特点类似的一种比较排序.该算法中,通过比较数组中相邻的(奇-偶)位置数字对,如果该奇偶对是错误的顺序(第一个大于第二个),则交换.下一步重复该操作,但针对所有的(偶-奇)位置数字对.如此交替进行下去. 使用奇偶排序法对一列随机数字进行排序的过程 处理器数组的排序 在并行计算排序中,每个处理器对应处理一个值,并仅有与左右邻居的本地互连.所有处理器可同时与邻居进行比较.交

  • JAVA实现简单抢红包算法(模拟真实抢红包)

    闲来无事,最近项目需求要写出用户登录首页来发现金红包,没有限额.我就自己稍微计算了一下如果有限额该怎么写.觉得这样与微信红包差不多.等项目需求完成以后.正好来博客贴一下我自己写的拆红包算法.个人觉得这个算法比较模拟现实抢红包规则.废话少说.先贴代码; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.ut

随机推荐