B - Leading and Trailing ——LightOJ - 1282(快速幂)

本文介绍了一种高效算法,用于计算任意正整数n的k次方的前三位和后三位数字。利用快速幂取模计算后三位,并通过计算10的指数次幂来确定前三位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
给出两个数,n和k,求n的k次方的前三位和后三位。
分析:
后三位用快速幂取模,模为1000即可。
前三位:一个数可以写成n=10^a,则n^k=10^ak=10^(x+y),其中,a是小数且a=log10(n)。ak的整数部分x代表了n^k的位数,小数部分y决定了它的值。
则10^y*100就是前三位。

下面介绍一下fmod函数。

原型:extern float fmod(float x, float y);
功能:计算x/y的余数
说明:返回x-n*y,符号同y。
fmod还可以计算小数点后的部分,fmod(x,1.0);

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=50000+5;
//快速幂取模
long long quick_mod(long long base,long long n,long long mod)
{
    long long res=1;
    while(n>0)
    {
        if(n%2!=0)
        {
            res=(res*base)%mod;

        }
        base=(base*base)%mod;
        n>>=1;
    }
    res=res%mod;
    return res;
}
int main()
{
    int T;
    scanf("%d",&T);
    int kase=0;
    while(T--)
    {
        printf("Case %d: ",++kase);
    long long a,b;
    scanf("%lld%lld",&a,&b);
    printf("%d ",(int)pow(10.0,2.0+fmod(b*1.0*log10(a*1.0),1)));
     printf("%03lld\n",quick_mod(a,b,1000));//补足前导0

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值