Problem Description
There is a youngster known for amateur propositions concerning several mathematical hard problems.
Nowadays, he is preparing a thought-provoking problem on a specific type of supercomputer which has ability to support calculations of integers between 0 and (2m−1) (inclusive).
As a young man born with ten fingers, he loves the powers of 10 so much, which results in his eccentricity that he always ranges integers he would like to use from 1 to 10k (inclusive).
For the sake of processing, all integers he would use possibly in this interesting problem ought to be as computable as this supercomputer could.
Given the positive integer m , your task is to determine maximum possible integer k that is suitable for the specific supercomputer.
Nowadays, he is preparing a thought-provoking problem on a specific type of supercomputer which has ability to support calculations of integers between 0 and (2m−1) (inclusive).
As a young man born with ten fingers, he loves the powers of 10 so much, which results in his eccentricity that he always ranges integers he would like to use from 1 to 10k (inclusive).
For the sake of processing, all integers he would use possibly in this interesting problem ought to be as computable as this supercomputer could.
Given the positive integer m , your task is to determine maximum possible integer k that is suitable for the specific supercomputer.
Input
The input contains multiple test cases. Each test case in one line contains only one positive integer
m
, satisfying
1≤m≤105
.
Output
For each test case, output "Case #
x
:
y
" in one line (without quotes), where
x
indicates the case number starting from
1
and
y
denotes the answer of corresponding case.
Sample Input
1 64
Sample Output
Case #1: 0 Case #2: 19
题意
给定一个数m,求2m−1所表示的10进制数的位数k
题解
开始没敢往数学上想,自己暴力瞎做....
其实只要两边同时取log就好了....
2m−1 =
10k
,因为2m一定是偶数,所以减一不会改变10进制位数
可以化简为log10(2m) = log10(
10k
)
2m2m
然后k = m*log10(2)
-----QAQ------
代码
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
double m;
int num=1;
while(scanf("%lf",&m)!=EOF)
{
int k;
k=(int)(1.0*m*log10(2.0));
printf("Case #%d: %d\n",num++,k);
}
return 0;
}
2m
−
1