題目
把一個硬幣拋5次,打印出所有可能出現(xiàn)的情況覆享。1表示正面佳遂,0表示背面。比如:
全正面 1 1 1 1 1
全背面 0 0 0 0 0
解題思路
有 N 個硬幣撒顿;
先計算有多少種可能性 count丑罪;
然后把 count 轉(zhuǎn)化成二進制打印凤壁;
注意打印的時候把不足 N 位數(shù)的結(jié)果前補上0湊夠 N 位數(shù)吩屹;
源碼
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define COIN_NUMBER 5
void binary(int number);
void main()
{
int i;
int count;
count = pow(2, COIN_NUMBER);//計算有多少種可能性
for (i = 0; i < count; i++)//遍歷所有可能性的次數(shù)
{
binary(i);
}
getchar();
}
void binary(int number)//轉(zhuǎn)化為二進制打印
{
char a[COIN_NUMBER + 1];//注意字符串結(jié)尾‘\0’,要多提供一位數(shù)組
itoa(number, a, 2);
printf("%05s", a);// %05s拧抖,意思在不足五位的字符串前加0
printf("\n");
}
執(zhí)行結(jié)果
coin.PNG
總結(jié)
這種算法提前人工計算了實驗結(jié)果是煤搜,利用了二進制偷懶了。不算是真的拋硬幣實驗唧席,只是打印結(jié)果剛好符合要求擦盾。
另一種全真模擬解題思路
利用rand函數(shù)返回的0和1當成拋硬幣的正反
建立一個二維數(shù)組保存實驗結(jié)果,每行記錄一個拋五次的結(jié)果且只記錄的不同的實驗結(jié)果
源碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void playFiveCoin(char * fiveRlt);
void checkCondition(char ** coinCd, char * fiveRlt);
int g_mayNum = 0;//定義一個全局變量作計數(shù)淌哟,計數(shù)對象是“不同的實驗結(jié)果數(shù)”
void main()
{
int i, j;
int playNum, signPlayNum;
char fiveResult[6];//由于字符串結(jié)尾要有‘\0’要多出一位數(shù)組存放它迹卢。故記錄拋5次銀幣的結(jié)果要要占用【6】個位置
char coinCondition[100][6];//用于存儲不同的實驗結(jié)果,一行存儲一組實驗結(jié)果
char * pCoin[100];
char ** ppCoin;
for (i = 0; i < 100; i++)
{
pCoin[i] = coinCondition[i];
}
ppCoin = pCoin;
//以上聲明各種變量
printf("每拋五個銀幣作為一組實驗徒仓,你想做多少組實驗?\n");
printf("請輸入實驗組數(shù):");
scanf("%d", &playNum);
signPlayNum = playNum;
while (playNum != 0)//當實驗次數(shù)沒有達到要求時
{
playFiveCoin(fiveResult);//拋五次銀幣
checkCondition(ppCoin, fiveResult);//當拋硬幣實驗結(jié)果不在記錄中時腐碱,加入到記錄中
playNum--;
}
for (i = 0; i < g_mayNum; i++)//打印實驗記錄
{
printf("%s\n", pCoin[i]);
}
printf("一共做了%d組實驗,得出%d組不同的結(jié)果\n", signPlayNum, g_mayNum);
getchar();
getchar();
}
void playFiveCoin(char * fiveRlt)//拋五次銀幣
{
int i;
char temp[2];
for (i = 0; i < 5; i++)
{
itoa(rand() % 2, temp, 10);//拋一個銀幣掉弛,并將實驗結(jié)果進行類型保存到temp數(shù)組中
fiveRlt[i] = temp[0];//記錄這一個銀幣的正反
}
fiveRlt[i] = '\0';//這組實驗做完了
}
void checkCondition(char ** coinCd, char * fiveRlt)//當拋硬幣實驗結(jié)果不在記錄中時症见,加入到記錄中
{
int i, diff = 0;
for (i = 0; i < g_mayNum; i++)//遍歷已有記錄
{
if (strcmp(*(coinCd + i), fiveRlt) != 0)//檢查是否在已有記錄
{
diff++;
}
}
if (diff == g_mayNum)//如果不在的記錄
{
strcpy(*(coinCd + i), fiveRlt);//就進行實驗結(jié)果錄入
g_mayNum++;//“不同的實驗結(jié)果數(shù)”增加一個
}
}
執(zhí)行結(jié)果
拋硬幣100次
拋500次
總結(jié)
1.當用數(shù)組存放字符串時,要記得給結(jié)尾‘\0’分配位置狰晚,否則會造成溢出
2.rand函數(shù)不是真正的隨機筒饰,每次運行調(diào)用rand函數(shù)結(jié)果都是相同的
如在第一次運行第一次調(diào)用rand返回0,第二次調(diào)用返回1
那在第二次運行第一次調(diào)用rand必也返回0壁晒,第二次調(diào)用返回也是1
那在第三次瓷们、第N次運行的第一次調(diào)用rand必也返回0,第二次調(diào)用返回必定也是1
但在同一次運行中不同次的調(diào)用返回解果的確是個隨機值