这道题来说,解题的思路非常的重要,不是暴力能解决的题目。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 ",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 的值才是决定位数上面的具体的值。这是要记下的!!!