uva 11029 Leading and Trailing

题目大意:

  输入两个数,分别是n,k,求nk的前三位,后三位,保证nk至少有6位。

解题思路:

  求前三位,因为后面的数字可能会影响前三位,double可以保证一部分精度又不至于会溢出,所以可以用二分快速幂+double来求前三位。

  求后三位,因为前面的数字不会影响到后三位,所以不用考虑精度,可直接用二分快速幂来求前三位,边乘边取余

代码:

  

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 #define maxn 16005
 8 int a[maxn];
 9 
10 double solve (double x)//求前三位的时候,控制x在1000以内
11 {
12     while (x >= 1000)
13         x /= 10;
14     return x;
15 }
16 
17 int high (int n, int k);
18 int low (int n, int k);
19 
20 int main ()
21 {
22     int t, n, k, l = 1;
23     scanf ("%d", &t);
24     while (t --)
25     {
26         scanf ("%d %d", &n, &k);
27         printf ("Case %d: %03d %03d\n", l++, high(n, k), low(n, k));//后三位可能出现第一位是零的时候
28     }
29     return 0;
30 }
31 
32 int high (int n, int k)
33 {
34     double x, y = 1;
35     x = n;
36     x = solve(x);
37     while (k)
38     {
39         if (k % 2)
40             y *= x;
41         x *= x;
42         k /= 2;
43         x = solve (x);
44         y = solve (y);
45     }
46     return (int)y;
47 }
48 
49 int low (int n, int k)
50 {
51     int m = 1;
52     n %= 1000;
53     while (k)
54     {
55         if (k % 2)
56             m = (m * n) % 1000;
57         n = (n * n) % 1000;
58         k /= 2;
59     }
60     return m;
61 }

 

posted @ 2015-04-18 15:48  罗茜  阅读(221)  评论(0编辑  收藏  举报