Add More Zero
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 868 Accepted Submission(s): 600
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
Source
//题意:问2的m次是10的几次数量级。
//思路:10的k次<2的m次<10的k+1次 => lg(2的m次)- 1 < k < lg(2的m次
)
因为m最大有100000,所以2的m次直接是算不出来的,所以要用个小技巧,lg里面乘是可以化成2个lg相加的,(比如:lg8=lg2+lg4),所以我们可以把2的m次拆一下,每次算2的100次(我电脑测试过2的100次是可以直接算的),然后加起来就可以了,但注意每次去加的那个k要是double的,不然会精度缺失!
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
long long m;
double k;
int main()
{
int Case = 1;
while (scanf("%lld", &m) != EOF)
{
printf("Case #%d: ", Case++);
k = 0;
while (m > 0)
{
if (m > 100)
k += log10(pow(2, 100));
else
k += log10(pow(2, m));
m = m - 100;
}
long long ans = (long long)k;
printf("%lld\n", ans);
}
return 0;
}
2m
2
m
2
m