给一个数n(1e9)和k(1e7),求n^k的前三位和后三位,,,后三位直接快速幂,主要是前三位怎么求。
设10^q=n^k,两边取log,得q=klgn,再利用一个函数 double a=modf(double x,double *i ),返回x的整数部分给i,小数部分给a
则q的整数部分就是1000...000,小数部分才是真正的前三位值,所以取a的前三位,用floor(x)函数,返回不大于x的最大整数值 以double类型数据返回。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n, k, t, c = 1;
int ksm(ll a, ll b) {
ll ans = 1;
while(b) {
if(b & 1) {
ans = (ans * a) % 1000;
}
b >>= 1;
a = (a * a) % 1000;
}
return (int)ans % 1000;
}
int main() {
cin >> t;
int l, h;
while(t--) {
double x, y;
cin >> n >> k;
l = ksm(n, k);
y = modf((double)(k * log10(n)), &x);
h = floor(pow(10, y) * 100);
printf("Case %d: %d %03d\n", c++, h, l);
}
return 0;
}