Leading and Trailing LightOJ - 1282
考察:快速幂+log运算
求后三位应该不用说,关键是前三位,打死我都想不到系列
看了大佬题解的思路:
涉及位数的题或许都涉及log10.这里也有道求位数的GO 虽然这道题我做过,但做本题的时候我完全没想起来
如果求前三位,可以考虑小数求比较方便,后三位就是整数求比较方便.因此这道题需要转化到小数求
nk= 10k*log10n 而指数可以分解为小数和整数.假设整数为a,小数为b. 我们可以发现a的作用就是将10b的小数点右移.因此计算b即可.
本题坑点:
- 请注意前导零
- 这道题最少都是六位数,所以不用考虑<6位数的情况
知识复习:
- 自动补充前导零的输出方式
printf("%03d",a);
- printf输出浮点数是四舍五入
- 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提供.