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 }

 

posted @ 2018-04-20 16:34  Somnus、M  阅读(177)  评论(0编辑  收藏  举报