蓝桥杯 adv206 不大的数

蓝桥杯 adv206 不大的数

问题描述

在当今的大数据时代,超大数的高精度计算已经成为众多领域的热门研究之一。现在T校也想在此领域有所造诣已造福于全社会,然而由于时间有限,所以短时间内难以找出大数计算的通用算法,于是学校找到了同学中的“神霸”——你来帮忙,并仅要求你能在数并不算大的时候给出结果。又出于某种特殊需要,也并不要求你给出数的全部结果,而只是要求结果的前10位(注意不是后10位),并考虑到2的幂次的特殊性和典型性,所以要你计算的数均为2的幂次。   

输入格式

一个自然数n。

输出格式

2的n次幂的前10位。

样例1 输入

60

样例1 输出

1152921504

样例2 输入

60000

样例2 输出

6305794870

数据规模和约定

0<=n<=10000000

参考解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>

using namespace std;

long long int MAX = 1000000000;

int main() {
double n;
cin >> n;
double r = log2(MAX);
if (n < r) {
printf("%lld", (long long)pow(2.0,n));
return 0;
}
double res = n*log10(2) - (long long)( n*log10(2));
res = pow(10.0,res);
while (res < MAX) res *= 10;
printf("%lld",(long long)res);
return 0;
}

注释

\[X=10^{lg(X)-[lg(X)]+[lg(X)]}\]

\([lg(X)]\) 就是 X 的位数,因此用 \(10^{lg(X)-[lg(X)]}\) 来保留 X 精度,剩下的乘以 10 就可以控制高位的输出位数。

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×