Ⅰ 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("輸出控制符 非輸出控制符",輸出參數);
這實際上就是上面那個例子。這時候會有一個問題:到底什麼是「輸出控制符」,什麼是「非輸出控制符」?很簡單,凡是以%開頭的基本上都是輸出控制符。