代码题--C++--牛客网--牛牛掷硬币--掷硬币全为正面或者全为反面的概率
题目描述
牛牛最近很喜欢掷硬币,由于他今天很无聊,所以他在家掷了n次硬币,如果这n次硬币全部朝上或者全部朝下牛牛就很开心,请问牛牛开心的概率是多少。(每次掷硬币朝上的概率与朝下的概率相同)
示例1
输入
1
返回值
"1.00"
说明
概率为1,四舍五入保留两位小数的字符串为"1.00"
示例2
输入
5
返回值
"0.06"
说明
概率为0.0625,四舍五入保留两位小数的字符串为"0.06"
备注:
对于50\%50%的数据:1\leq n\leq1001≤n≤100
对于100\%100%的数据:1\leq n\leq1e91≤n≤1e9
对于每个n,返回一个严格四舍五入保留两位小数的字符串。
比如概率为0.372的话,返回字符串"0.37"。
概率为0.957的话,返回字符串"0.96"。
(注意,返回的字符串不带引号)
解题思路,掷一次,答案为1.00,因为正反面都会开心,从第二次开始概率就是累计*0.5,最后将四舍五入保留小数后两位,C++中用sprintf函数处理。sprintf和printf很像,区别就是sprintf中第一个参数就是指向要写入的那个字符串的指针,其他和printf一样,为什么加0.001,是因为编译器不同,可能ans的取舍不同,为达到说明中的条件才+0.001.
代码如下:
class Solution {
public:
/**
* 返回一个严格四舍五入保留两位小数的字符串
* @param n int整型 n
* @return string字符串
*/
string Probability(int n) {
if(n >= 9)
{
return "0.00";
}
double ans = 1;
for(int i = 1; i < n; i++ )
{
ans *= 0.5;
}
char printAns[10];
sprintf(printAns,"%.2lf",ans+0.001 );
return printAns;
}
/*
if(n==1){
string res="1.00";
return res;
}
if(n==2) {
string res="0.50";
return res;
}
if(n==3){
string res="0.25";
return res;
}
if(n==4){
string res="0.13";
return res;
}
if(n==5){
string res="0.06";
return res;
}
if(n==6){
string res="0.03";
return res;
}
if(n==7){
string res="0.02";
return res;
}
if(n==8){
string res="0.01";
return res;
}
string res="0.00";
return res;
}
*/
};