E - Leading and Trailing

这道题来说,解题的思路非常的重要,不是暴力能解决的题目。n*k = (10^x) * (10^y)  .y的部分是决定位数上面具体的值。因此得到y之后在int first =10^(y+2) ,就是前三位数字。解决这道题必须要用上<cmath> 之下的很多函数,fmod,pow,log10等等。代码之后将详细介绍它们的用法。

code :

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;

ll quickpow(ll m,ll n,ll k)  //快速幂取模函数,m:底数:指数,k:取模数
{
    ll ans=1;          //结果数ans
    m=m%k;
    while(n > 0)       //当指数大于0的时候就执行循环
    {
        if(n&1)       //跟if(n%2 == 1) 的效果一样
            ans = (ans*m)%k;    //消除指数为奇数的影响
        n=n >> 1;          //n的二进制数右移一位;
        m = (m*m) % k;      // 因为指数右移,所以这一步要消除指数右移的影响
    }
    return ans%k;
}
//其实快速幂取模跟快速幂函数相差无几,只是记得在关键步骤后面要对K取模,防止数据爆掉;

int main()
{
    ll m,n,T;
    scanf("%lld",&T);
    for(int i=1;i<=T;i++)
    {
        scanf("%lld %lld",&m,&n);
        int first = pow(10.0,2.0+fmod(n*log10(m*1.0),1));

        //cout<<"mod = "<<mod<<endl;
        int second = quickpow(m,n,1000);
        printf("Case %d: %d %03d\n",i,first,second);
    }
    return 0;
}
/*
1、%03d 输出形式
2、n&1 的判断格式
3、fmod 函数的用法
4、pow 函数的用法
5、快速幂取模函数
*/

 代码上面的:

第一点:%03d  的输出格式,前三位不会出现019这样的情况,但是后三位会出现,当后三位是019这样的情况时,为输出保证是三位数而不是19,就要写成%03d;(这是题目的小陷阱,多注意)。

第二点:n & 1  的书写格式可以参照,意思就是判断数的奇偶性,起到的效果跟n % 2 == 1 一样。

第三点:fmod 函数,double fmod(double x,double y);函数返回x/y的余数。举个例子:在这道题中,a=15.123456的小数部分怎么得到?就是fmod(a,1.0);就可以了。

第四点:double pow(double base,double exp);

第五点:学会熟练运用快速幂取模函数,可以把它跟快速幂函数一起记忆,因为他们之间有很多相似点。

最最重要的一点就是这道题的解题思路,log10n=指数。n*k = (10^x) * (10^y)  .10^y 的值才是决定位数上面的具体的值。这是要记下的!!!

猜你喜欢

转载自www.cnblogs.com/myxdashuaige/p/8992380.html