题目
把一个硬币抛5次,打印出所有可能出现的情况。1表示正面,0表示背面。比如:
全正面 1 1 1 1 1
全背面 0 0 0 0 0
解题思路
有 N 个硬币;
先计算有多少种可能性 count;
然后把 count 转化成二进制打印;
注意打印的时候把不足 N 位数的结果前补上0凑够 N 位数;
源码
#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++)//遍历所有可能性的次数
{
binary(i);
}
getchar();
}
void binary(int number)//转化为二进制打印
{
char a[COIN_NUMBER + 1];//注意字符串结尾‘\0’,要多提供一位数组
itoa(number, a, 2);
printf("%05s", a);// %05s,意思在不足五位的字符串前加0
printf("\n");
}
执行结果
总结
这种算法提前人工计算了实验结果是,利用了二进制偷懒了。不算是真的抛硬币实验,只是打印结果刚好符合要求。
另一种全真模拟解题思路
利用rand函数返回的0和1当成抛硬币的正反
建立一个二维数组保存实验结果,每行记录一个抛五次的结果且只记录的不同的实验结果
源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void playFiveCoin(char * fiveRlt);
void checkCondition(char ** coinCd, char * fiveRlt);
int g_mayNum = 0;//定义一个全局变量作计数,计数对象是“不同的实验结果数”
void main()
{
int i, j;
int playNum, signPlayNum;
char fiveResult[6];//由于字符串结尾要有‘\0’要多出一位数组存放它。故记录抛5次银币的结果要要占用【6】个位置
char coinCondition[100][6];//用于存储不同的实验结果,一行存储一组实验结果
char * pCoin[100];
char ** ppCoin;
for (i = 0; i < 100; i++)
{
pCoin[i] = coinCondition[i];
}
ppCoin = pCoin;
//以上声明各种变量
printf("每抛五个银币作为一组实验,你想做多少组实验?\n");
printf("请输入实验组数:");
scanf("%d", &playNum);
signPlayNum = playNum;
while (playNum != 0)//当实验次数没有达到要求时
{
playFiveCoin(fiveResult);//抛五次银币
checkCondition(ppCoin, fiveResult);//当抛硬币实验结果不在记录中时,加入到记录中
playNum--;
}
for (i = 0; i < g_mayNum; i++)//打印实验记录
{
printf("%s\n", pCoin[i]);
}
printf("一共做了%d组实验,得出%d组不同的结果\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);//抛一个银币,并将实验结果进行类型保存到temp数组中
fiveRlt[i] = temp[0];//记录这一个银币的正反
}
fiveRlt[i] = '\0';//这组实验做完了
}
void checkCondition(char ** coinCd, char * fiveRlt)//当抛硬币实验结果不在记录中时,加入到记录中
{
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);//就进行实验结果录入
g_mayNum++;//“不同的实验结果数”增加一个
}
}
执行结果
总结
1.当用数组存放字符串时,要记得给结尾‘\0’分配位置,否则会造成溢出
2.rand函数不是真正的随机,每次运行调用rand函数结果都是相同的
如在第一次运行第一次调用rand返回0,第二次调用返回1
那在第二次运行第一次调用rand必也返回0,第二次调用返回也是1
那在第三次、第N次运行的第一次调用rand必也返回0,第二次调用返回必定也是1
但在同一次运行中不同次的调用返回解果的确是个随机值