问题描述
在当今的大数据时代,超大数的高精度计算已经成为众多领域的热门研究之一。现在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 }