问题描述
在当今的大数据时代,超大数的高精度计算已经成为众多领域的热门研究之一。现在T校也想在此领域有所造诣已造福于全社会,然而由于时间有限,所以短时间内难以找出大数计算的通用算法,于是学校找到了同学中的“神霸”——你来帮忙,并仅要求你能在数并不算大的时候给出结果。又出于某种特殊需要,也并不要求你给出数的全部结果,而只是要求结果的前10位(注意不是后10位),并考虑到2的幂次的特殊性和典型性,所以要你计算的数均为2的幂次。
输入格式
一个自然数n。
输出格式
2的n次幂的前10位。
样例1 输入
60
样例1 输出
1152921504
样例2 输入
60000
样例2 输出
6305794870
数据规模和约定
0<=n<=10000000
如果是输出后10位的话还可以考虑取模。
这是输出前十位,然后就是在思维上做出转变的时候了。
正解是:比如2的n次幂的结果我们用t表示,t的结果可能很大很大,比10位还多。
然后我们用一个double类型的变量ans,ans的整数部分存储t前10位,ans的小数部分存储t除去前十位后的其他位。
比如样例n=60时,t=2^60=1,152,921,504,606,846,976?。
那ans就等于1,152,921,504......606,846,976?。为了显眼,用六个小数点表示一个小数点。
然后处理一下四舍五入。
ans-=0.5
然后输出ans的整数部分,就是要求的数的前10位。
惊不惊喜,意不意外。
AC代码,参考自https://blog.csdn.net/weixin_44667597/article/details/105312353
1 #include <bits/stdc++.h>
2 using namespace std;
3 int n;
4 int main() {
5 double ans = 1;
6 int n;
7 cin >> n;
8 if (n == 0) {
9 cout << 1 << endl;
10 return 0;
11 }
12 while (n--) {
13 ans *= 2;
14 if (ans > 9999999999) {
15 ans /= 10;
16 }
17 }
18 ans -= 0.5;
19 cout << fixed << setprecision(0) << ans << endl;
20 return 0;
21 }
蓝桥杯 不大的数
原文:https://www.cnblogs.com/fx1998/p/12721969.html