LightOJ 1282 Leading and Trailing(对数转化)

题意:

给n,k,求nk的前三位和后三位

思路:

后三位直接快速幂对1000取模就行了,主要是前三位怎么求。

前三位:
一个整数x可用科学计数法表示为10r*a
由科学计数法可知r为整数,a为1-10之间的整数

设nk=x=10r*a
两边取对数得k log10(n)=log10(x)=log10(a)+r
因为r是整数,a小于10,所以r是整数部分,log10(a)是小数部分

因为是小数部分,可以利用强制类型转化的技巧直接求出小数部分:
log10(a)=log10(x)-(int)log10(x)=k log10(n)-(int)(k log10(n))

则a等于10klog10(n)-(int)(klog10(n))
(int)(a*100)即为nk的前三位

ps:
有个坑点就是后三位可能是027这种有前导零的,前导零也要输出。

code:

#include<bits/stdc++.h>
using namespace std;
const int mod=1e3;
int ppow(int a,int b){//快速幂
    a%=mod;
    int ans=1;
    while(b){
        if(b&1){
            ans=ans*a%mod;
        }
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
int getfront(int n,int k){
    return (int)(pow(10.0,k*log10(n)-(int)(k*log10(n)))*100);
}
signed main(){
    int T;
    scanf("%d",&T);
    int cas=1;
    while(T--){
        int n,k;
        scanf("%d%d",&n,&k);
        printf("Case %d: ",cas++);
        printf("%d %03d\n",getfront(n,k),ppow(n,k));//后三位可能要输出前导零
    }
    return 0;
}
发布了364 篇原创文章 · 获赞 26 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/103439475