成功率5%のことに1回でも成功する確率が80%以上になるのは、何回挑戦した時か
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#include <stdio.h> #include <math.h> /** * 任意の整数を底とする対数を計算する * y = log a x * @param[in] base 底 a * @param[in] antilog 真数 x */ double logn(double base, double antilog) { return log(antilog) / log((double)base); } /** * 成功率5%のことに1回でも成功する確率が80%以上になるのは、何回挑戦した時か */ int main(void){ int p = 5; // 成功率 int q = 80; // 目標成功率 double l = 1.0 - p/100.0; double r = 1.0 - q/100.0; int cnt = 1; double ll = l; while(1){ cnt++; ll *= l; if(ll <= r){ break; } } double n = cnt - 1; double offset = 0.0000001; while(1){ n += offset; if(pow(l, n) < r){ break; } } printf("計算解 : %f 回\n", n); double a = l; double x = r; double ans = logn(a, x); printf("解析解 : %f 回\n", ans); } |
1 2 |
計算解 : 31.377160 回 解析解 : 31.377160 回 |