下面是我的程序,各位高手可以运行试一下,当我求2的10次方模1000或其它的数,以及其它较小的数的时候就会正确,但是当我用于求3的1234567次方模100000的时候就无法运算出来了,这个过程中应该是越界了,因为部分我调试时输出那些保存下来的每一步的模中有负数.
我同学与我使用相同的算法,但是他好像使用的是C语方中的unsigned类型数据.但是也只能算致34567这个数量级,像1234567就无法运算.我的这两个数都无法运算public class Main {//建立项目主类,也是程序的运行的入口类
    
    /** Creates a new instance of Main */
    public static void main(String[] args) {
        int a=5;//一般情况下,本程序适用于解所有int类型的相关运算
        int b=1234;
        int n=1000;//通过定义可以设定要求尾数的位数
       FigureTail tail=new FigureTail(a,b,n);//初始化FigureTail类
       System.out.println("最后五位应该是:"+tail.tailOut());
       for(int i=0;i<32;i++)
       System.out.println(tail.y[i]);
    }
  }
class FigureTail{
    public FigureTail(int a,int b,int n){//构造函数,初始化运算对象
    as=a;
    bs=b;
    ns=n;
    y[0]=1;//把初始的前两个模值定义好,方便递推运算
    y[1]=as%ns;
    }
  
    public int 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;
        int itsTail=1;
        for(int j=1;j<32;j++){
            if(x[j-1]==1)
            {  itsTail*=y[j];
               itsTail%=ns;
            } 
        }        
       return  itsTail%ns;
    }
    private int as;
    private int bs;
    private int ns;
    private int count=0;//记录化成二进制后的位数
    private int itsTail;//最后算出来的尾数 
    //JAVA中Integer对象的值最高为32位
    //JAVA很不方便的一个地方就是数组必須初始化并只能使用下面的方法赋值
    public int[] y=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};
    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};
    
    
}