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 }
本文为博主原创文章,未经博主允许不得转载。