您的位置:首页 > 大数据 > 人工智能

LightOJ1282 Leading and Trailing(截取前n位输出)

2017-03-21 15:24 375 查看


题意:

         输入n^k,输出n^k的前3位与后3位.



思路:

最后的三位可以直接快速幂取余,但要注意不够要补前导0.

求前三位则需要一些数学知识对于给定的一个数n,它可以写成10^a,其中这个a为浮点数,则n^k=(10^a)^k=10^a*k=(10^x)*(10^y);

其中x,y分别是a*k的整数部分和小数部分对于t=n^k这个数,它的位数由(10^x)决定,它的位数上的值则有(10^y)决定,因此我们

要求t的前三位,只需要将10^y求出,再乘以100,就得到了它的前三位。

fmod(x,1)可以求出x的小数部分

                                                                                   


                                                                            tmp就是上面说的y

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const ll mod = 1000;
int fast_pow(ll tmp, ll k)
{
tmp = tmp % mod;
int ans = 1;
while(k)
{
if(k&1)
ans = (ans*tmp) % mod;
k >>= 1;
tmp = tmp*tmp % mod;
}
return ans;
}
int main()
{
int T;
ll n, k;
scanf("%d", &T);
for(int kase = 1; kase <= T; kase++)
{
scanf("%lld%lld", &n, &k);
int x = (int)pow(10.0, 2.0+fmod(k*log10(1.0*n), 1));
int y = fast_pow(n, k);
printf("Case %d: %d %03d\n", kase, x, y);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: