Ⅰ c语言编程:某企业年终按员工业绩发红包,已知红包金额不到10000元。
#include<stdio.h>
intmain()
{
/*我的第一个C程序*/
intmoneynum;
intc[7]={0,0,0,0,0,0,0};
printf("输入红包金额: ");
scanf("%d",&moneynum);
while(moneynum>0)
{
if(moneynum/100>=1)
{
moneynum-=100;
c[0]++;
}
elseif(moneynum/50>=1)
{
moneynum-=50;
c[1]++;
}
elseif(moneynum/20>=1)
{
moneynum-=20;
c[2]++;
}
elseif(moneynum/10>=1)
{
moneynum-=10;
c[3]++;
}
elseif(moneynum/5>=1)
{
moneynum-=5;
c[4]++;
}
elseif(moneynum/2>=1)
{
moneynum-=2;
c[5]++;
}
elseif(moneynum/1>=1)
{
moneynum-=1;
c[6]++;
}
}
printf("纸币数量为 ");
printf("100元:%d张 ",c[0]);
printf("50元:%d张 ",c[1]);
printf("20元旁启:含启漏%d张 ",c[2]);
printf("10元:%d张 ",c[3]);
printf("5元:%d张 ",c[4]);
printf("2元:%d张 ",c[5]);
printf("1元:%d张 ",c[6]);
return谈烂0;
}
结果如下:
Ⅱ C语言 微信红包
#include<stdio.h>
#include<string.h>
#include<time.h>
#defineMAX_TOTAL_MONEY200//红包的最大金额
#defineMIN_PER_PLAYER1//一个人抢到的的最小面额1元
#defineMAX_PLAYER_CNT(MAX_TOTAL_MONEY/MIN_PER_PLAYER)//最大抢红包的游戏人数
typedefstructplayer
{
char*name;//标记玩家可以不填
unsignedintmoney_get;//抢到的红包
}PLAYER_T;
//每个人领取到的红包金额不等这个要求比较难搞暂时不考虑
intmain(intargc,char*argv[])
{
unsignedinttotal_money=0;//不考虑角和分浮点运算比较复杂
unsignedintplayer_cnt=0;
inton_off=0;
inti=0;
intj=0;
PLAYER_Tplayer[MAX_PLAYER_CNT]={0};
PLAYER_Ttmp={0};
printf("输入红包金额: ");
scanf("%u",&total_money);
printf("输入游戏人数: ");
scanf("%u",&player_cnt);
printf("是否需要减小贫富差距(0为关闭其余为开启): ");
scanf("%u",&on_off);
//不符合规则的输入判断
if(total_money>MAX_TOTAL_MONEY||0==total_money||0==player_cnt||player_cnt*MIN_PER_PLAYER>total_money)
{
printf("红包金额最小%u元最大%u元游戏人数最小1人最大%u人 ",MIN_PER_PLAYER,MAX_TOTAL_MONEY,MAX_PLAYER_CNT);
return0;
}
for(i=0;i<player_cnt;i++)
{
//设置随机种子
srand(time(NULL)+i);
//根据随机种子获取一个伪随机数作为抢到的红包并通过余运算使其始终小于total_money
player[i].money_get=rand()%total_money;
//限制所有人所能抢到的最大红包为当前金额池的1/5而不是全部
if(0!=on_off)
{
if(total_money>5)//5块钱以上再限制
{
player[i].money_get=rand()%(total_money/5);
}
}
//最后一个人拿所有剩下的红包
if(player_cnt-1==i)
{
player[i].money_get=total_money;
}
//运气差随机到0元给你最小面额
elseif(0==player[i].money_get)
{
player[i].money_get=MIN_PER_PLAYER;
}
//剩下的要保证每个人能抢到最小面额
elseif(total_money-player[i].money_get<(player_cnt-i-1)*MIN_PER_PLAYER)
{
player[i].money_get=total_money-(player_cnt-i-1)*MIN_PER_PLAYER;
}
//把抢到的金额从红包池中减掉
total_money-=player[i].money_get;
//如果填了name可以把名字打印出来
printf("第%d个玩家抢到红包:%u元 ",i+1,player[i].money_get);
}
//冒泡排序找出手气最佳者
for(i=0;i<player_cnt;i++)
{
for(j=i+1;j<player_cnt;j++)
{
if(player[i].money_get<player[j].money_get)
{
memcpy(&tmp,&player[j],sizeof(PLAYER_T));
memcpy(&player[j],&player[i],sizeof(PLAYER_T));
memcpy(&player[i],&tmp,sizeof(PLAYER_T));
}
}
}
printf("手气最佳者抢到红包:%u元 ",player[0].money_get);//如果填了name可以把名字打印出来
return0;
}
Ⅲ C语言红包代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
main()
{
inti,n;
floata[100],all;
srand(time(NULL));
printf("请输入红包金额:");
scanf("%f",&all);
printf("请输入红包个数:");
scanf("%d",&n);
srand((unsigned)time(0));
for(i=1;i<n;i)
{
a[i]=(float)rand()/RAND_MAX*all;
if(a[i]>0)
{
all-=a[i];
printf("%f
",a[i]);
i++;
}
}
printf("%f
",all);
}
Ⅳ (二)微信红包高并发系统设计方案(1)
2017年1月28日,正月初一,微信公布了用户在除夕当天收发微信红包的数量——142亿个,而其收发峰值也已达到76万每秒。百亿级别的红包,如何保障并发性能与资金安全?这给微信带来了超级挑战。面对挑战,微信红包在分析了业界“秒杀”系统解决方案的基础上,采用了 SET化、请求排队串行化、双维度分库表 等设计,形成了独特的高并发、资金安全系统解决方案。实践证明,该方案表现稳定,且实现了除夕夜系统零故障运行。概要:
一、业务 特点 :海量的并发要求;严格的安全级别
二、技术 难点 :并发请求抢锁;事务级操作量级大;事务性要求严格
三、解决高并发问题 通常 使用的 方案 :
1.使用内存操作替代实时的DB事务操作(优点:内存操作替代磁盘操作,提高了并发性能。)
2使用乐观锁替代悲观锁。应用于微信红包系统,则会存在下面三个问题:滚并返回失败;并发大失败,小成功。DB压力大。
四、微信 红包 系统的高并发解决 方案 :
1.系统垂直SET化,分而治之。
2.逻辑Server层将请求排队,解决DB并发问题。
3.双维度库表设计,保障系统性能稳定
类似“秒杀”活动,群里发一个红包=“秒杀”商品上架;抢红包的动作=“秒杀”的查询库存;拆红包=“秒杀”
同一时间有10万个群里的用户同时在发红包,那就相当于同一时间有10万个“秒杀”活动发布出去。10万个微信群里的用户同时抢红包,将产生海量的并发请求。
微信红包是微信支付的一个商户,提供资金流转服务。
用户发红包=购买一笔“钱”(在微信红包这个商户上),并且收货地址是微信群。当用户支付成功后,红包“发货”到微信群里,群里的用户拆开红包后,微信红包提供了将“钱”转入折红包用户微信零钱的服务。
资金交易业务比普通商品“秒杀”活动有更高的安全级别要求。普通的商品“秒杀”商品由商户提供,库存是商户预设的,“秒杀”时可以允许存在“超卖”、“少卖”的情况。但是对于微信红包,100元不可以被拆出101元;领取99元时,剩下的1元在24小时过期后要精确地退还给发红包用户,不能多也不能少。
在介绍微信红包系统的技术难点之前,先介绍下简单的、典型的商品“秒杀”系统的架构设计,如下图所示。
该系统由接入层、逻辑服务层、存储层与缓存构成。Proxy处理请求接入,Server承载主要的业务逻辑,Cache用于缓存库存数量、DB则用于数据持久化。
一个“秒杀”活动,对应DB中的一条库存记录。当用户进行商品“秒杀”时,系统的主要逻辑在于DB中库存的操作上。一般来说,对DB的操作流程有以下三步:
a. 锁库存
b. 插入“秒杀”记录
c. 更新库存
a.锁库存是为了 避免 并发请求时出现“ 超卖 ”情况。同时要求这 三步操作 需要在 一个事务 中完成(难点:并发请求抢锁)。
第一个事务完成提交之前这个锁一直被第一个请求占用,后面的所有请求需要 排队等待 。同时参与“秒杀”的用户越多,并发进DB的请求越多,请求 排队越严重 。
红包系统的设计上, 除了并发请求抢锁之外,还有以下两个突出难点 :
首先,事务级操作量级大 。上文介绍微信红包业务特点时提到,普遍情况下同时会有数以万计的微信群在发红包。这个业务特点映射到微信红包系统设计上,就是有数以万计的“并发请求抢锁”同时在进行。这使 得DB的压力 比普通单个商品“库存”被锁要大很多倍。
其次,事务性要求严格 。微信红包系统本质上是一个资金交易系统,相比普通商品“秒杀”系统有更高的事务级别要求。
普通商品“秒杀”活动系统,解决高并发问题的方案,大体有以下几种:
如图2所示,将“实时扣库存”的行为上移到 内存Cache中操作 ,内存Cache操作成功直接给Server返回成功,然后 异步落DB持久化 。
优点:提高了并发性能。
缺点: 在内存操作 成功 但 DB持久化失败 ,或者内存 Cache故障 的情况下,DB持久化会 丢数据 ,不适合微信红包这种资金交易系统。
商品“秒杀”系统中,乐观锁的具体应用方法,是在DB的“库存”记录中维护一个版本号。在更新“库存”的操作进行前,先去DB获取当前版本号。在更新库存的事务提交时,检查该版本号是否已被其他事务修改。如果版本没被修改,则提交事务,且版本号加1;如果版本号已经被其他事务修改,则回滚事务,并给上层报错。
这个方案解决了“并发请求抢锁”的问题,可以提高DB的并发处理能力。
应用于微信红包系统,则会存在下面三个问题 :
1.在并发抢到相同版本号的拆红包请求中, 只有一个能拆红包成功 , 其他的请求 将事务回滚并返回失败,给用户 报错 ,用户体验完全不可接受。
2.将会导致 第一时间 同时拆红包的用户有一部分直接 返回失败 ,反而那些“ 手慢 ”的用户,有可能因为 并发减小 后拆红包 成功 ,这会带来用户体验上的负面影响。
3.会带来 大数量 的 无效 更新 请求 、事务 回滚 ,给 DB 造成不必要的额外 压力 。
微信红包用户发一个红包时,微信红包系统生成一个ID作为这个红包的唯一标识。接下来这个红包的所有发红包、抢红包、拆红包、查询红包详情等操作,都根据这个ID关联。
红包系统根据这个红包ID,按一定的规则(如按ID尾号取模等),垂直上下切分。切分后,一个垂直链条上的逻辑Server服务器、DB统称为一个SET。
各个SET之间相互独立,互相解耦。并且同一个红包ID的所有请求,包括发红包、抢红包、拆红包、查详情详情等,垂直stick到同一个SET内处理,高度内聚。通过这样的方式,系统将所有红包请求这个巨大的洪流分散为多股小流,互不影响,分而治之,如下图所示。
这个方案解决了同时存在海量事务级操作的问题,将海量化为小量。
红包系统是资金交易系统,DB操作的事务性无法避免,所以会存在“并发抢锁”问题。但是如果到达DB的事务操作(也即拆红包行为)不是并发的,而是串行的,就不会存在“并发抢锁”的问题了。
按这个思路,为了使拆红包的事务操作串行地进入DB,只需要将请求在 Server层以FIFO ( 先进先出 )的方式排队,就可以达到这个效果。从而问题就集中到Server的FIFO队列设计上。
微信红包系统设计了分布式的、轻巧的、灵活的FIFO队列方案。其具体实现如下:
首先,将同一个红包ID的所有请求stick到同一台Server。
上面SET化方案已经介绍,同个红包ID的所有请求,按红包ID stick到同个SET中。不过在同个SET中,会存在多台Server服务器同时连接同一台DB(基于容灾、性能考虑,需要多台Server互备、均衡压力)。
为了使同一个红包ID的所有请求,stick到同一台Server服务器上,在SET化的设计之外,微信红包系统添加了一层基于红包ID hash值的分流,如下图所示。
其次,设计单机请求排队方案。
将stick到同一台Server上的所有请求在被接收进程接收后,按红包ID进行排队。然后 串行地进入worker进程 (执行业务逻辑)进行处理,从而达到 排队 的效果,如下图所示。
最后,增加memcached控制并发。
为了 防止 Server中的请求队列过载导致队列被降级,从而所有请求 拥进DB ,系统增加了与Server服务器同机部署的 memcached ,用于控制拆同一个红包的 请求并发数 。
具体来说,利用memcached的 CAS原子累增操作 ,控制同时进入 DB执行拆红包事务的请求数 ,超过预先设定数值则 直接拒绝服务 。用于 DB负载升高时的降级 体验。
通过以上三个措施,系统有效地 控制了DB的“并发抢锁” 情况。
红包系统的分库表规则,初期是根据 红包ID的hash值 分为多库多表。随着红包数据量逐渐增大,单表数据量也逐渐增加。而DB的性能与单表数据量有一定相关性。当单表数据量达到一定程度时,DB性能会有大幅度下降,影响系统性能稳定性。采用 冷热分离 ,将历史冷数据与当前热数据分开存储,可以解决这个问题。
系统在以 红包ID维度 分库表的基础上,增加了以 循环天分表的维度 ,形成了 双维度分库表 的特色。
具体来说,就是分库表规则像db_xx.t_y_dd设计,其中,xx/y是红包ID的 hash值后三位 ,dd的取值范围在01~31,代表一个月天数最多 31 天。
通过这种双维度分库表方式,解决了DB单表数据量膨胀导致性能下降的问题,保障了系统性能的稳定性。同时,在热冷分离的问题上,又使得数据搬迁变得简单而优雅。
综上所述,微信红包系统在解决高并发问题上的设计,主要采用了SET化分治、请求排队、双维度分库表等方案,使得单组DB的并发性能 提升了8倍 左右,取得了很好的效果。
http://www.infoq.com/cn/articles/2017hongbao-weixin
Ⅳ 模拟一个微信抢红包的算法,钱数为x,人数为y,用随机数显示出每个红包的金额,c语言题目
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
doubleRandom(){return(rand()%1000)*0.001;}
doubleRandom(doubleaver)
{
doubleret=0;
for(inti=0;i<2;++i)ret+=Random();
return(aver*ret);
}
intmain(intargv,int**argc)
{
doublex,v;
inty,i;
doubleaver,min;
srand(time(NULL));
printf("请输入金额:");
scanf("%lf",&x);
printf("请输人数:");
scanf("%d",&y);
aver=x/y;
min=0.01*y;
for(i=0;i<y-1&&x>min;++i)
{
v=Random(aver);
while(v>x)v=Random(aver);
printf("%.2f ",v);
x-=v;
min-=0.01;
}
for(i=0;i>y-1;++i)
{
printf("%.2f ",0.01);
x-=0.01;
}
printf("%.2f ",x);
return0;
}
Ⅵ C语言的这个问题!
我想试一试,但愿你这不是作业题。
终于有时间来写一个程序了。
程序中的注释是中文的,在TC2.0环境下是乱码,这个你要注意。
#include<stdio.h>
#include<string.h>
char name[10][14]; /*最多10人,每人名字最多14个字符*/
/*查找串在数组name中的位置*/
int index(char *p)
{
int k=0;
while(k<10&&strcmp(p,name[k]))
k++;
return k;
}
int main()
{
int people=1; /*有多少人?至少2人*/
char name_tmp[14];
int balance[10]; /*每个人的收支帐户*/
int i,j;
int children=0,money=0;
/*输入人数,并保证输入人数合法*/
printf("How many people?");
while(people<2||people>10)
scanf("%d",&people);
/*输入人的名字,并初始化他们的帐户*/
puts("Who are they?");
for(i=0;i<people;i++)
{
scanf("%s",name[i]);
balance[i]=0;
}
for(i=0;i<people;i++)
{
/*为了使输入的简单化,这儿没让用户输入名字,而是顺次输出人名*/
puts(name[i]);
/*提示输入钱数,和小孩数*/
printf("Input money and number of children:");
scanf("%d%d",&money,&children);
if(children>0) /*如果小孩的人数不为0*/
{
balance[i]+=0-(money-money%children); /*计算这人付出了多少钱*/
puts("Who are they?"); /*提示输入这些钱分给哪些人*/
for(j=0;j<children;j++)
{
scanf("%s",name_tmp);
balance[index(name_tmp)]+=(children==0?0:money/children); /*修改得到钱的人的帐户 */
}
}
}
/*输出人名和差额*/
for(i=0;i<people;i++)
printf("%s %d\n",name[i],balance[i]);
return 0;
}
Ⅶ 求c语言/c++大神编写发红包问题
完整代码如下:
#include<stdio.h>
voidmain()
{
intmoney;
intmoney1,money2,money5,money10,money20,money50,money100;
printf("请输入金额:");
scanf("%d",&money);
money100=money/100;
money=money%100;
money50=money/50;
money=money%50;
money20=money/20;
money=money%20;
money10=money/10;
money=money%10;
money5=money/5;
money=money%5;
money2=money/2;
money1=money%2;
printf("100元:%d张 ",money100);
printf("50元:%d张 ",money50);
printf("20元:%d张 ",money20);
printf("10元:%d张 ",money10);
printf("5元:%d张 ",money5);
printf("2元:%d张 ",money2);
printf("1元:%d张 ",money1);
}
运行结果如下图:
这时我们再编译、链接、执行一下:i = 10, j = 3i=、,、空格和j=全都原样输出了。此外需要注意的是:“输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。
4) printf("输出控制符 非输出控制符",输出参数);
这实际上就是上面那个例子。这时候会有一个问题:到底什么是“输出控制符”,什么是“非输出控制符”?很简单,凡是以%开头的基本上都是输出控制符。