题意:给一个数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;
}
继续加油~