题目地址
题目大意
输出n^k的前3位和后三位
题目解析:后三位可以直接使用快速幂对1000取模实现。难点在于如何求前三位
推导过程如下:
n^k = 10^(lg n^k) = 10^(klg n)
klgn = a(整数部分)+b(小数部分)
于是
10^(klg n) = 10^a * 10^b(0<=b<1)
便可以通过10^b看出前几位数字。
如何求b呢
modf( )函数
那么我们还要分析一下klgnk∗lgn是否会出现数据范围爆出的问题,double可控制的是16位,而k*lgn<=1e7∗lgn<1e9.所以可实现。
从本题的输出中学到的东西:
本题注意输出:后三位万一是0XX或00X或00X
所以还要补位…
%3d–可以指定宽度,不足的左边补空格
%03d—一种左边补0 的等宽格式,比如数字12,%03d出来就是: 012
哦,还有就是原来c语言中loga(N)可以直接算出来的
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int p = 1000;
ll res,fir;
double x,y;
ll binarypow(ll a, ll b) {
ll ans=1;
while(b>0) {
if(b&1) {
ans=ans*a%p;
}
a=a*a%p;
b>>=1;
}
return ans;
}
int main()
{
int t;
cin>>t;
int cnt=0;
while(t--) {
ll n, k;
cin >> n >> k;
res=binarypow(n,k);
y=modf((double)(k*log10(n)),&x);
fir=pow(10,y)*100;
printf("Case %d: %lld %03lld\n",++cnt,fir,res);
}
return 0;
}