UVa 11029 Leading and Trailing(log法求大数前3位)

题意:

给定n, k,求n^k的前3位和后三位。

思路:

1. 后三位司空见惯,利用快速幂取模,二分法快速求解。

2. 前三位要费点周折了,要用到库函数以及log (后面默认10为底),有了这些知识储备就可以巧妙的求解前3位了。

   先分析对于n求其前3位,n很大:a = logn,于是有n = 10^a。分解a = i + d,i为a的整数部分,d为小数部分

   n = 10^i * 10^d,由于10^i只会影响位数,所以真正影响n的前3位的是10^d,求出10^d就OK了

 

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>



long long int foo(int n, int k)

{

    if (k == 1)

        return n % 1000;



    long long int ans;



    ans = foo(n, k >> 1);

    ans = (ans * ans) % 1000;



    if (k % 2)

        ans = (ans * n) % 1000;



    return ans;

}



void solve(int n, int k)

{

    int t3 = foo(n, k);

    int l3 = (int)pow(10, 2 + fmod(k*log10(n*1.0), 1));

    printf("%d...%03d\n", l3, t3);

}



int main()

{

    int cases;

    scanf("%d", &cases);

    while (cases--)

    {

        int n, k;

        scanf("%d %d", &n, &k);

        solve(n, k);

    }

    return 0;

}

 

你可能感兴趣的:(log)