HDU-6033 Add More Zero

来源:互联网 发布:sql多张表合并 编辑:程序博客网 时间:2024/06/04 19:02

题意:给一个数m,求一个数k满足10^k小于等于2^m-1。

思路:

先了解几个数学知识:

(logn m) = (logx m)/(logx n)

(logn m) = 1/(logm n)

log(N*M) = logN + logM

cmath头文件中的log(x)是以e为底x为真数的对数函数(也有log2(x), log10(x)),即数学中的ln(x),e = 2.718281828459。求任意数A的开N次方:pow(A, 1/N)。

对数函数的单调性

当a>1时,y = (loga x)在(0,+∞)上为增函数

当0<a<1时,y = (loga x)在(0,+∞)上为减函数


这题其实是简单的公式化简:

= 10^k <= 2^m-1

= 10^k < 2^m

= ln10^k < ln 2^m

= k*ln10 < m*ln2

= k < m*1n2/1n10


代码:

#include <cstdio>#include <cmath>using namespace std;int main(){int m, ans1, count = 0;while(~scanf("%d", &m)){double ans2 = (double)m*log(2)/log(10);ans1 = ans2;//判断相等与否,本题不判断也能过 if(ans2 > ans1) printf("Case #%d: %d\n", ++count, ans1);else printf("Case #%d: %d\n", ++count, ans1-1);}return 0;}


继续加油~