E - Leading and Trailing(快速幂+思维)

题目:http://www.lightoj.com/volume_problemstat.php?problem=1282

这个题妙在用double 来处理 前三位



这个题妙在用double  来处理 前三位
```cpp
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll qpow(ll a, ll b, ll mod)
{
    ll base = a;// 2^0
    ll ret = 1;
    while(b)
    {
        if(b%2)ret=ret*base%mod;
        base = base*base%mod;
        b>>=1;
    }

    return ret;
}
ll qpow(double a, ll b, ll div)
{
    double base = a;
    double ret = 1;
    while(b)
    {
        if(b%2)ret=ret*base;
        base = base*base;
        while(ret >=1000.0)// 每次处理 , 将ret小数点前  只保持三位
        {
            ret/=div;
        }

        while(base>=1000.0)// 每次处理 将base小数点 只保持三位
        {
            base/=div;
        }

        b/=2;
    }

    return (ll)ret;// 转换成整形(这样只得到 小数点前三位, 小数都被砍掉了)
}
int main()
{

    int T;
    cin>>T;
    ll n, k;
    int cnt = 0;
    while(T--)
    {
        cin>>n>>k;
        ll ans1 = qpow((double)n, k, 10);// 通过将 答案 保持在 前三位.xxx 的形似维护前三位
        ll ans2 = qpow(n, k, 1000);// 通过每次 mod1000 维护后三位
        cout<<"Case "<<++cnt<<": ";
        printf("%lld %03lld\n", ans1, ans2);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值