当前位置: 代码迷 >> 综合 >> LightOJ1282 Leading and Trailing(截取前n位输出)
  详细解决方案

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

热度:8   发布时间:2023-12-06 19:51:44.0

题意:
         输入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;
}


  相关解决方案