Leading and Trailing LightOJ - 1282

原题链接

考察:快速幂+log运算

求后三位应该不用说,关键是前三位,打死我都想不到系列

看了大佬题解的思路:

       涉及位数的题或许都涉及log10.这里也有道求位数的GO   虽然这道题我做过,但做本题的时候我完全没想起来

      如果求前三位,可以考虑小数求比较方便,后三位就是整数求比较方便.因此这道题需要转化到小数求

       nk= 10k*log10n 而指数可以分解为小数和整数.假设整数为a,小数为b. 我们可以发现a的作用就是将10b的小数点右移.因此计算b即可. 

本题坑点:

  1. 请注意前导零
  2. 这道题最少都是六位数,所以不用考虑<6位数的情况

知识复习:

  1. 自动补充前导零的输出方式 
    printf("%03d",a);

     

  2. printf输出浮点数是四舍五入
  3. int自动舍去末尾小数
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 using namespace std;
 5 typedef long long ll;
 6 ll qsm(int n,int k,int q)
 7 {
 8     ll res = 1;
 9     while(k)
10     {
11         if(k&1) res = res*n%q;
12         k>>=1;
13         n = (ll)n*n%q;
14     }
15     return res;
16 }
17 int main()
18 {
19     int T,kcase = 0;
20     scanf("%d",&T);
21     while(T--)
22     {
23         ll n,k,ans; scanf("%lld%lld",&n,&k);
24         double tmp = k*log10((double)n); int t = tmp;
25         tmp-=t;
26         double tmp2 = pow(10,tmp);
27         if(t>=2) ans = 100*tmp2;
28         else ans = t*tmp;
29         printf("Case %d: %03d %03lld\n",++kcase,ans,qsm(n,k,1000));
30     }
31     return 0;
32 } 

 

2021.6.3 二刷,再做一次只想到了用科学计数法求前三位,但是并没有什么卵用.

10整数a+小数b 有效数字都由10b提供.

posted @ 2021-01-26 02:12  acmloser  阅读(54)  评论(0编辑  收藏  举报