JAVA确实是一种强类型的语言,今天在做这个题目"3的1234567次方的后五位数是多少"的时候就碰到了这个问题,首先是把所有数据类型都定义为int类型,但是发现只能求较小的数值,因为int型只有32位,而本题中要进行模运算的数在都应该是四位以上的十进制数,所以在平方后可能会越界.因而比较好的处理办法就是把在存各次模的数组定义为long型,也就是64位.这样问题就解决了.
另外就是JAVA对类型的要求很强,在进行非同类型数值运算的时候要记得强制轉換.
java 代码
- public class Main {//建立项目主类,也是程序的运行的入口类
- /** Creates a new instance of Main */
- public static void main(String[] args) {
- int a=3;//一般情况下,本程序适用于解所有int类型的相关运算
- int b=1234567;
- long n=100000;//通过定义可以设定要求尾数的位数
- FigureTail tail=new FigureTail(a,b,n);//初始化FigureTail类
- System.out.println("最后五位应该是:"+tail.tailOut());
- }
- }
- class FigureTail{
- public FigureTail(int a,int b,long n){//构造函数,初始化运算对象
- as=a;
- bs=b;
- ns=n;
- y[0]=(long)1;//把初始的前两个模值定义好,方便递推运算
- y[1]=(long)(as%ns);
- }
- public long tailOut(){
- int tempB=bs;//把幂1234567化成二进制数
- while(tempB!=1){
- x[count]=(int)(tempB%2);
- tempB=(int)(tempB/2);
- count++;
- }
- x[count]=1;
- for(int i=2;i<32;i++)
- y[i]=(y[i-1]*y[i-1])%ns;
- long itsTail=(long)1;
- for(int j=1;j<32;j++){
- if(x[j-1]==1)
- { itsTail*=y[j];
- itsTail%=ns;
- }
- }
- itsTail%=ns;
- return itsTail ;
- }
- private int as;
- private int bs;
- private long ns;
- private int count=0;//记录化成二进制后的位数
- private long itsTail;//最后算出来的尾数
- //JAVA中integer对象的值最高为32位
- //JAVA很不方便的一个地方就是数组必須初始化并只能使用下面的方法赋值
- public long[] y=new long[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- private int[] x=new int[] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- }