UVA 11029--取n的k次幂的前m位数

问题是简化为这样, nk=x ,求 x 的前m位数,当然这种问题一般会在精度范围内的。
给出一个简单的计算公式你就明白了。

nk=x
lognk10=log10x
x=10klogn10 ,这个数很大,显然不能直接计算
a=floor(klogn10),b=klogn10a ,a为 klogn10 的整数部分,b为小数部分。

显然,

x=10a10b ,
x 的前几位数肯定是由 10b 决定的,这是一个介于0~10之间的小数

所以, x 的前 m 位数就为 10m110b .
这就是答案了。
在这儿来练练手吧
uva 11029
求前三位和后三位。
后三位很简单,快速幂就行了.
代码

int PowerMod(int a, int b, int c)
{
    int ans = 1;
    a = a % c;
    while(b>0) {
        if(b % 2 == 1)
        ans = (ans * a) % c;
        b = b/2;
        a = (a * a) % c;
    }
    return ans;
}



int main()
{
    //freopen("H:\\c++\\file\\stdin.txt","r",stdin);
    int T,kase =0;
    scanf("%d",&T);
    int n,k;
    while(T--)
    {
         scanf("%d %d",&n,&k);

        double a = k*log10(n);
        a -=floor(a);
        double ans1 = pow(10,a)*100;
        cout<<floor(ans1)<<"...";
        int ans = PowerMod(n,k,1000);
        printf("%03d\n",ans);
    }
}

你可能感兴趣的:(算法理论)