求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的每一位(个,十,百......)相乘再加和的过程,也就是(a1个位 a2 十位...)
比如,123*123的最后两位尾数,其实就只和2,3两位数有关,对于前一个123的百位1,就算将其与第二个123的个位3相乘,也只能得到100*3=300,这只和尾数的第三位相关,对我们要求的两位尾数没有任何影响
那么我们可以总结出,我们如果想求x位尾数,尾数的值只和a的最后n位数相关。
因此,我们只需要将每次x相乘的最后n位储存并循环来解决int的存储问题