UVA 11029 Leading and Trailing

本文详细解析了一种求解特定幂运算前后三位数的算法,包括使用快速幂法计算末尾三位数及利用数学方法获取最高三位数的技术细节。

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

You are given two integers: n and k, your task is to find the most significant three digits, and least significant three digits of nk.

Input
Input starts with an integer T (≤ 1000), denoting the number of test cases.

Each case starts with a line containing two integers: n (2 ≤ n < 231) and k (1 ≤ k ≤ 107).

Output
For each case, print the case number and the three leading digits (most significant) and three trailing digits (least significant). You can assume that the input is given such that nk contains at least six digits.

Sample Input
5
123456 1
123456 2
2 31
2 32
29 8751919
Sample Output
Case 1: 123 456
Case 2: 152 936
Case 3: 214 648
Case 4: 429 296

Case 5: 665 669


   这是一道有关于幂取模的算法。可能题意大家很容易就能够给读懂,就是求一个数a的n次方,然后输出所求的这个数的前三位和后三位数。可能会有人会有点小疑惑,

会想问,如果这个数没有六位数的话,该怎么办的呢?那小编想提醒你一下,再看一下题,在题的最后一句话已经说明了,这个数的n次方至少有六位数,所以不用担心。

在这里,我也不啰嗦了,我们来进一步的了解一下题。

  求这个数的后三位相信大家掌握的了如指掌了吧。我们可以用二分的方法来进行查找,其简略代码如下:


        

int M(int a , int n)              //二分取模
{
    if(n==1)   return a%1000;
    int x=M(a,n/2);
    long long ans=(long long)x*x%1000;
    if(n&1)   ans=ans*a%M;              //  (n&1) 表示 n%2 == 1
    return (int)ans;
}

   当然也可以运用快速幂的方法查找后三位,其代码如下:

int M(int a,int n)              //快速幂
{
    int m = 1;
    a = a%1000;
    while(n)
    {
        if(n%2)
            m = m*a%1000;
        n = n/2;
        a = (a*a)%1000;
    }
    return m;
}
       以上两种方法都可以实现找后三位数,个人比较赞同用第二种方法,在实践中,就要看个人了,毕竟咋方便咋来了。

       谈完了后三个数,就要我们来看看怎样查找前三个数了。在这里,可能有的人将会了解到一个新的知识  ,那就是关于(double ) fmod (double x,double y),这一个

函数,它是一个关于x对y取余,库函数为<math.h>。说到这,可能会有人会说,我们以前学的那个 % 不是也是取余么,为啥不用它呢,在这里,我就长话短说吧。% 是对整数取余,余数是整数,但是 这个函数就显得格外的特殊,它的余数可以是小数。如果想深入了解,也可以单独查找一些资料。

     

      

       left=(int)pow( 10.0 , 2 + fmod(n*log10(a) , 1) );           //fmod表示的是求余,本题中是求小数部分,可能是负数
    
          

上面这一部分是求前三位数的核心部分。可能会有人对第一句话会有些不理解。我们可以推一下。

文章求得是 a^n , 我们可以把它转换成 10^x 这种情况,  这样 x = n*log10(a),  在这里,那个10 千万千万不要给忘记。有可能会有人问,为什么

要这样转换呢,其实这样转换,我们就可以很轻松的得到这个数了,X可能是一个小数,小数部分的取值范围为 10^0 < y < 10^1 ; 由于求的是三位数

为保证输出有三位数,我们需要 + 2 也就是乘以 10^2。 说到这里,想必大家对于这道题有了更深的理解了吧,还等什么,趁热打铁试一试吧。

下面是整体代码,哦,忘了说了,再输出的时候,可能后面的三位数全部为0,所以不能以%d 的形式输出,我们应该用 %3d。

#include<stdio.h>
#include<math.h>

int M(int a,int n)              //快速幂
{
    int m = 1;
    a = a%1000;
    while(n)
    {
        if(n%2)
            m = m*a%1000;
        n = n/2;
        a = (a*a)%1000;
    }
    return m;
}

int main()
{
    int T,a,n,s=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&a,&n);
        int left,right;
        left=(int)pow( 10.0 , 2 + fmod(n*log10(a) , 1) );           //fmod表示的是求余,本题中是求小数部分,可能是负数
        right=M(a,n);
        printf("Case %d: %d %03d\n",s++,left,right);                //03 不能去
    }
    return 0;
}

 


资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值