求一个分数小数点后指定位数的数字

题目链接:https://ac.nowcoder.com/acm/contest/548/B

题意:给你一个分数a/b,求分数小数点后k1-k2位数值各是多少

之前写过天梯赛的模拟竖式题,这个题看了看就直接模拟了,然后就T了

但还是可以用模拟竖式的思想,n*10^(k1-1)*10/n就是小数点后第k1位的值了

记得开long long 然后中间用快速幂取模以防爆掉

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;    
ll m,n,k1,k2;
ll pow_mod(ll a, ll b){//a的b次方求余p 
    ll ret = 1;
    while(b){
        if(b & 1) ret = (ret * a) % n;
        a = (a * a) % n;
        b >>= 1;
    }
    return ret;
}
int main()
{    int T;scanf("%d",&T);
    while(T--){
        scanf("%lld%lld%lld%lld",&m,&n,&k1,&k2);
        ll ans=m*pow_mod(10,k1-1)%n;
        for(int i=k1;i<=k2;i++){
            ans*=10;
            cout<<ans/n;
            ans%=n;    
        }
        cout<<endl;
    }
    return 0;
}

 

posted @ 2019-04-09 22:08  清酒令  阅读(345)  评论(0编辑  收藏  举报