PTA7-15求尾数(附代码) 求x的y次方的最后n位数。输入格式:输入在一行中依次给出3个正整数x,y,n,其中x,y小于1000,n小于6。

 求x的y次方的最后n位数。

输入格式:

输入在一行中依次给出3个正整数x,y,n,其中x,y小于1000,n小于6。

输出格式:

输出n位数的结果即可,若不足n位,则在结果前补若干个0,直到n位。行末尾无多余空格和换行

输入样例1:

13 13 3

输出样例1:

253

输入样例2:

2 3 4

输出样例2:

0008

用switch加不同个数前导零 (本方法比较麻烦不推荐)

#include<stdio.h>
#include<math.h>
int main(){
    int x,y,n,i,end=1,a;
    scanf("%d %d %d",&x,&y,&n);
    a=pow(10,n);
    for(i=0;i<y;i++){
        end=end*x%a;
    }
    switch(n){
        case 1:
            printf("%01d",end);
            break;
        case 2:
            printf("%02d",end);
            break;
        case 3:
            printf("%03d",end);
            break;
        case 4:
            printf("%04d",end);
            break;
        case 5:
            printf("%05d",end);
            break;
    }
    return 0;
}

对于加不同位数的前导零,找到了更简单的方法

修改后是这样 

​
#include<stdio.h>
#include<math.h>
int main(){
    int x,y,n,i,end=1,a;
    scanf("%d %d %d",&x,&y,&n);
    a=pow(10,n);                //为下面求最后n位做准备
    for(i=0;i<y;i++){
        end=end*x%a;            //将每次x相乘的最后n位取出,使求尾数能够在整型存储范围内进行
    }
    printf("%0*d",n,end);       //对于不同n值,加不同个数的前导零
    return 0;
}

​

 求尾数原理:

因为c语言里int型储存能力有限,所以无法储存过大的数值(比如13的13次方),因此不能直接求出具体的数值。那么怎么求出最后x位尾数呢?

对于a的b次方,假设我们要求他的n位尾数,那么对尾数有影响的变量是什么?

我们将a*a提出来看,我们可以将a*a的过程看作第一个a的每一位(个,十,百......)分别拆解并与第二个a的每一位(个,十,百......)相乘再加和的过程,也就是a*a=(a1+10*a2+...+10^{n}an)*(a1+10*a2+...+10^{n}an).(a1个位 a2 十位...)

比如,123*123的最后两位尾数,其实就只和2,3两位数有关,对于前一个123的百位1,就算将其与第二个123的个位3相乘,也只能得到100*3=300,这只和尾数的第三位相关,对我们要求的两位尾数没有任何影响

那么我们可以总结出,我们如果想求x位尾数,尾数的值只和a的最后n位数相关。

因此,我们只需要将每次x相乘的最后n位储存并循环来解决int的存储问题

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值