代码题--C++--牛客网--牛牛掷硬币--掷硬币全为正面或者全为反面的概率

代码题--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;
    }
    */  
};

 

你可能感兴趣的:(剑指offer,面试题,C++)