例题 Problem link XDOJ1029
最高位
x=nmx=10lgnm(alogab=b)x=10mlgn
问题变成求10mlgn的最高位和最低位,为什么用10为底,因为是10进制。
在10的指数函数中,f(x)=10x,函数值的最高位从1~9取决于x的小数部分,并且不管10的多少次幂后,最高位都是和小数部分相关且一致,所以只需要求10的小数部分次幂即可
设k为mlgn的小数部分k=mlgn−⌊mlgn⌋highest digit=⌊10k⌋
1 2 3 4 5 6
| int highest_digit(double n, double m) { double x = m * log10(n); double k = x - (int)x; return (int)(pow(10, k) + 0.000001); }
|
最低位
- 最低位是循环的,可以存下来直接查表
- 直接求快速幂模10也不是不行
sample code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include<iostream> #include<stdlib.h> #include<cmath> using namespace std; int main(void) { int T; cin >> T; int b[4] = {2, 4, 8, 6}; int n, t1, max, min; double x, k; while(T--) { cin >> n; t1 = (n - 1) % 4; x = n * log10(2.0); k = x - (int)x; max = (int)(pow(10, k) + 0.000001); min = b[t1]; cout << max << " " << min << endl; } return 0; }
|