zoukankan      html  css  js  c++  java
  • 蓝桥杯 不大的数

    问题描述
      在当今的大数据时代,超大数的高精度计算已经成为众多领域的热门研究之一。现在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 }
  • 相关阅读:
    PA
    核电站问题(codevs 2618)
    [转]SQL SERVER 的排序规则
    C# 窗体控件输入框大写
    查看哪些端口被使用
    [转]Windows服务“允许服务与桌面交互”的使用和修改方法
    [转]OBJECT_ID 有哪些种类
    如何:对 Windows 窗体控件进行线程安全调用
    老人手机不要买山寨机
    VBA文本型数字变成数值
  • 原文地址:https://www.cnblogs.com/fx1998/p/12721969.html
Copyright © 2011-2022 走看看