LightOJ 1282 Leading and Trailing(求n^k的前三位)
题意:给你一个数n,让你求这个数的k次方的前三位和最后三位
大体思路:后三位直接用快速幂即可
求前三位则需要一些数学知识对于给定的一个数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的小数部分。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 5 using namespace std; 6 7 int length(long long n) 8 { 9 return (int)log10(n)+1; 10 } 11 12 13 long long quick1(long long a,long long b) 14 { 15 int s=1; 16 while(b>0) 17 { 18 if(b%2==1) 19 { 20 s=s%1000; 21 a=a%1000; 22 s=s*a; 23 } 24 a=a*a%1000; 25 b=b>>1; 26 27 } 28 return s; 29 } 30 31 int main() 32 { 33 ios::sync_with_stdio(false); 34 int T; 35 long long a,b; 36 cin>>T; 37 for(int i=1;i<=T;i++) 38 { 39 cin>>a>>b; 40 int s=quick1(a,b); 41 if(length(s)>3) 42 { 43 s=quick1(a,b)%1000; 44 } 45 double x=pow(10.0,fmod(b*log10(1.0*a),1)); 46 //fmod()函数求出小数部分,log10(1.0*a)则为10^a的小数部分 47 //fmod(x,y)函数即计算x/y的余数 48 x=x*100.0; 49 printf("Case %d: %d %03d\n",i,(int)x,s); 50 } 51 52 return 0; 53 }