uva 11029 Leading and Trailing
2015-04-18 15:48
337 查看
题目大意:
输入两个数,分别是n,k,求nk的前三位,后三位,保证nk至少有6位。
解题思路:
求前三位,因为后面的数字可能会影响前三位,double可以保证一部分精度又不至于会溢出,所以可以用二分快速幂+double来求前三位。
求后三位,因为前面的数字不会影响到后三位,所以不用考虑精度,可直接用二分快速幂来求前三位,边乘边取余
代码:
输入两个数,分别是n,k,求nk的前三位,后三位,保证nk至少有6位。
解题思路:
求前三位,因为后面的数字可能会影响前三位,double可以保证一部分精度又不至于会溢出,所以可以用二分快速幂+double来求前三位。
求后三位,因为前面的数字不会影响到后三位,所以不用考虑精度,可直接用二分快速幂来求前三位,边乘边取余
代码:
#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; #define maxn 16005 int a[maxn]; double solve (double x)//求前三位的时候,控制x在1000以内 { while (x >= 1000) x /= 10; return x; } int high (int n, int k); int low (int n, int k); int main () { int t, n, k, l = 1; scanf ("%d", &t); while (t --) { scanf ("%d %d", &n, &k); printf ("Case %d: %03d %03d\n", l++, high(n, k), low(n, k));//后三位可能出现第一位是零的时候 } return 0; } int high (int n, int k) { double x, y = 1; x = n; x = solve(x); while (k) { if (k % 2) y *= x; x *= x; k /= 2; x = solve (x); y = solve (y); } return (int)y; } int low (int n, int k) { int m = 1; n %= 1000; while (k) { if (k % 2) m = (m * n) % 1000; n = (n * n) % 1000; k /= 2; } return m; }
相关文章推荐
- UVa:11029 Leading and Trailing
- UVA 11029 Leading and Trailing
- uva 11029 - Leading and Trailing
- UVA 11029 Leading and Trailing [数学]
- UVA 11029 Leading and Trailing
- UVa 11029 - Leading and Trailing 求n^k的前3位
- UVA 11029 Leading and Trailing
- Uva 11029 – Leading and Trailing(快速幂取模,log(x)的应用)
- UVA 11029 Leading and Trailing
- UVa 11029 Leading and Trailing (如何计算n^k的开头三位和末尾三位?)
- UVa 11029 - Leading and Trailing 求n^k的前3位
- uva 11029 Leading and Trailing(求n^k的前几位和后几位 证明)
- uva 11029 Leading and Trailing
- UVA 11029 - Leading and Trailing
- 【uva】11029 Leading and Trailing
- uva 11029 Leading and Trailing
- uva11029 - Leading and Trailing
- UVa 11029 Leading and Trailing (如何计算n^k的开头三位和末尾三位?)
- UVA 11029 - Leading and Trailing
- UVA 11029 Leading and Trailing(大数n^k的前x位高精度问题)(好题)