求小数点后第n位

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//求小数点后第n位,很容易想到(a*10^(n+2)/b)%1000,即可得到数值,注意输出的时候左边补充0
//但是a*10^(n+2)太大了,long long 溢出了,利用公式x/d%m = (x%(d*m)/d)%m,直接获得等价类
//得到,((a*10^(n+2)%(b*1000))/b)%m,这样就可以用快速幂求了
ll a,b,n,s;
//ll pow(ll x,ll y,ll m){
//    if(y==0) return 1;
//    ll p=pow(x,y/2,m);
//    if(y&1) p=((p*p)%m*x)%m;
//    else p=(p*p)%m;
//    return p;
//}
ll pow(ll x,ll y,ll m){
    //把y分成2进制表示,这样是1就x,就可以凑出x^y
    ll s=1;
    while(y>0){
        if(y&1) s=s*x%m;
        y>>=1;
        x=x*x%m;
    }
    return s;
}
int main() {
    cin>>a>>b>>n;
    ll mod=b*1000,res=((a%mod*pow(10,n+2,mod))/b)%1000;
    printf("%03lld
",res);
    return 0;
}
原文地址:https://www.cnblogs.com/MorrowWind/p/13056584.html