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;
}

 

posted @ 2012-12-05 14:48  kedebug  阅读(364)  评论(0编辑  收藏  举报