Leading and Trailing(数论基础)

来源:互联网 发布:底层软件开发工程师 编辑:程序博客网 时间:2024/05/16 14:54

题目来源:https://vjudge.net/problem/LightOJ-1282
【题意】
求一个数n的k次方后的前三位与后三位。并且后三位要求控制格式。
【思路】
灵活使用log函数。
说一下这里是怎样使用log10函数的:
假设p=3.3254,那么10^p==2115.436532
而10^(p-3)==2.115437。
也就是说,p在这里是10的次幂,10^p代表一个数x,那么p的整数部分指的是x的小数点位置(可以这么理解),而小数部分代表的是x的值(当然小数点位置不一样)。
依照这个办法,将一个数使用double类型表示(通过log10函数),然后将小数部分进行pow函数得到一个值,那么前三位的话,只需要乘以100取整就可以了。
【代码】

#include<map>#include<stack>#include<queue>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<iostream>#include<string>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;const int INF=1e9;typedef long long LL;int quick_pow(int a,int b){    int ans=1,base=a%1000;    while(b)    {        if(b&1)        {            ans=(ans*base)%1000;        }        base=(base*base)%1000;        b>>=1;    }    return ans;}int main(){    int T,cases=1;    scanf("%d",&T);    while(T--)    {        int n,k;        scanf("%d%d",&n,&k);        double a=(double)k*log10(n*1.0);        a=a-(int)a;        double p=pow(10.0,a);        int q=quick_pow(n,k);        printf("Case %d: %d %03d\n",cases++,(int)(p*100.0),q);    }}
0 0