C語(yǔ)言實(shí)現(xiàn)搶紅包算法
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)搶紅包的具體代碼,供大家參考,具體內(nèi)容如下
1、算法背景:
大家知道,微信拼手氣紅包和普通紅包兩種。普通紅包每個(gè)人搶到的金額是固定的(總額的平均數(shù)),拼手氣紅包是隨機(jī)金額(每個(gè)人搶到的是隨機(jī)的,差別可能非常大,有的人搶到的是1分,有的搶到的可能是幾元、十幾元、幾十元),目前的搶紅包算法只能輸入兩個(gè)參數(shù),即總金額、總?cè)藬?shù)。
2、算法要求:
現(xiàn)要求同學(xué)們?cè)O(shè)計(jì)一個(gè)改進(jìn)的搶紅包算法,可以設(shè)定總金額(total)、總?cè)藬?shù)(num)、搶到的最低金額(min)和最高金額(max),這樣就可以控制每個(gè)搶紅包的,搶到的不會(huì)太少,也不會(huì)太多。
(1)先用自然語(yǔ)言給出算法設(shè)計(jì)的思想:
第一步:輸入紅包金額總金額,紅包個(gè)數(shù),紅包金額最低/最高額度。
第二步:判斷帶輸入數(shù)據(jù)是否滿足算法要求,不滿足輸出提示信息,并重新輸入數(shù)據(jù)。
第三步:生成一個(gè)隨時(shí)紅包金額
第四步:判斷紅包金額是否滿足條件,如果滿足,繼續(xù)生成下一個(gè)紅包金額,如果不滿足在
此生成新的隨機(jī)紅包金額,知道滿足條件。
第五步:輸出搶紅包的過(guò)程信息
(2)進(jìn)行異常檢查與處理;
(3)給出C語(yǔ)言源代碼實(shí)現(xiàn),運(yùn)行結(jié)果展示;
源代碼如下
#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; } // 數(shù)據(jù)輸入 void input() { double total; int num; double min_price, max_price; printf("請(qǐng)輸入以下數(shù)據(jù):\n"); printf("紅包總金額: "); scanf("%lf", &total); putchar('\n'); printf("紅包數(shù)量: "); 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) 之間的隨機(jī)數(shù) int range_random_price(int start_price, int end_price) { return rand()%(end_price-start_price+1) +start_price; } // total :總金額(元) num:人的個(gè)數(shù) min_price max_price :最低/最高金額 void redPackets(double Total, int num, double Min_price, double Max_price) { // 剛開(kāi)始金額全部擴(kuò)大100倍轉(zhuǎn)變成整數(shù),最后輸出的再除以一百,轉(zhuǎn)變?yōu)楦↑c(diǎn)數(shù) 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("您輸入的總金額過(guò)小,或者搶的紅包金額最低限度過(guò)大,請(qǐng)重新輸入\n"); input(); return ; } printf("搶紅包結(jié)果如下:\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 個(gè)人搶到的紅包金額為 %.2f, 紅包剩余金額為 %.2f\n", i, (double)(random_price/100.0), (double)(total/100.0)); } if(maxx < total) maxx = total, maxx_index = num; // 輸出最后一個(gè)人的紅包金額 printf("第 %d 個(gè)人搶到的紅包金額為 %.2f, 紅包剩余金額為 0.00\n", num, (double)(total/100.0)); printf("運(yùn)氣王是 %d 號(hào)\n", maxx_index); }
程序運(yùn)行結(jié)果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
全面解析C++中的new,operator new與placement new
以下是C++中的new,operator new與placement new進(jìn)行了詳細(xì)的說(shuō)明介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09深入了解C語(yǔ)言的動(dòng)態(tài)內(nèi)存管理
所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文將用5600字帶你深入了解動(dòng)態(tài)內(nèi)存管理,感興趣的可以學(xué)習(xí)一下2022-07-07C/C++ assert()函數(shù)用法案例總結(jié)
這篇文章主要介紹了C/C++ assert()函數(shù)用法案例總結(jié),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09C++產(chǎn)生隨機(jī)數(shù)的幾種方法小結(jié)
本文主要介紹了C++產(chǎn)生隨機(jī)數(shù)的幾種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03C++實(shí)現(xiàn)四則運(yùn)算器(帶括號(hào))
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)四則運(yùn)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11C++map,set,multiset,multimap詳細(xì)解析
在C++標(biāo)準(zhǔn)模板庫(kù)(STL)中,容器分為關(guān)聯(lián)式容器和序列式容器兩大類,關(guān)聯(lián)式容器主要包括set、map、multiset和multimap,通過(guò)索引來(lái)訪問(wèn)元素,本文給大家介紹C++?map,set,multiset,multimap的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2024-09-09