题目地址
题目大意
输出n^k的前3位和后三位
题目解析:后三位可以直接使用快速幂对1000取模实现。难点在于如何求前三位
推导过程如下:
n^k = 10^(lg n^k) = 10^(klg n)
k
lgn = a(整数部分)+b(小数部分)
于是
10^(klg n) = 10^a * 10^b(0<=b<1)
便可以通过10^b看出前几位数字。
如何求b呢
modf( )函数
那么我们还要分析一下k
lgnk∗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;
 }