本文主要是介绍LightOJ 1282 Leading and Trailing,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:求n^k的前三位和后三位。(n,k为大数)
分析:
后三位可以用快速幂得到(不足三位要补领0)。重点是求前三位。
n可以写成10^a(a为小数)的形式。因此 n^k = 10^(ak). 而ak可以写成x+y,其中x为ak的整数部分,y为ak的小数部分.其中x决定了位数,y决定了值。 因此只需求出y。 而n=10^a ,所以 a=log10(n)
这里用到了fmod函数,fmod(x,1)可以求出x的小数部分
因此用fmod(ak,1)即可求出y。
代码:
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;int quickmod(int n, int k, int mod)
{if(k == 1) return n%mod;long long t = quickmod(n, k/2, mod);long long ans = t * t % mod;if(k % 2 == 1) ans = ans * n % mod;return ans;
}
int main()
{int t, n, k; cin >> t;int kase = 1;while(t--){cin >> n >> k;int x = (int) pow(10.0, 2.0 + fmod(k * log10(1.0 * n),1));int y = quickmod(n, k, 1000);printf("Case %d: %d %03d\n", kase++, x, y);}return 0;
}
这篇关于LightOJ 1282 Leading and Trailing的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!