今天的密码学作业,求模的幂运算题.使用JAVA时发现的几个问题

JAVA确实是一种强类型的语言,今天在做这个题目"3的1234567次方的后五位数是多少"的时候就碰到了这个问题,首先是把所有数据类型都定义为int类型,但是发现只能求较小的数值,因为int型只有32位,而本题中要进行模运算的数在都应该是四位以上的十进制数,所以在平方后可能会越界.因而比较好的处理办法就是把在存各次模的数组定义为long型,也就是64位.这样问题就解决了.
另外就是JAVA对类型的要求很强,在进行非同类型数值运算的时候要记得强制轉換.
java 代码
  1. public class Main {//建立项目主类,也是程序的运行的入口类   
  2.        
  3.     /** Creates a new instance of Main */  
  4.     public static void main(String[] args) {   
  5.         int a=3;//一般情况下,本程序适用于解所有int类型的相关运算   
  6.         int b=1234567;   
  7.         long n=100000;//通过定义可以设定要求尾数的位数   
  8.        FigureTail tail=new FigureTail(a,b,n);//初始化FigureTail类   
  9.        System.out.println("最后五位应该是:"+tail.tailOut());   
  10.     }   
  11.   }   
  12. class FigureTail{   
  13.     public FigureTail(int a,int b,long n){//构造函数,初始化运算对象   
  14.     as=a;   
  15.     bs=b;   
  16.     ns=n;   
  17.     y[0]=(long)1;//把初始的前两个模值定义好,方便递推运算   
  18.     y[1]=(long)(as%ns);   
  19.     }   
  20.      
  21.     public long tailOut(){   
  22.         int tempB=bs;//把幂1234567化成二进制数   
  23.         while(tempB!=1){   
  24.             x[count]=(int)(tempB%2);   
  25.             tempB=(int)(tempB/2);   
  26.             count++;   
  27.         }   
  28.       x[count]=1;   
  29.         for(int i=2;i<32;i++)   
  30.         y[i]=(y[i-1]*y[i-1])%ns;   
  31.         long itsTail=(long)1;   
  32.         for(int j=1;j<32;j++){   
  33.             if(x[j-1]==1)   
  34.             {  itsTail*=y[j];   
  35.                itsTail%=ns;   
  36.             }    
  37.         }      
  38.         itsTail%=ns;   
  39.        return itsTail ;   
  40.     }   
  41.     private int as;   
  42.     private int bs;   
  43.     private long ns;   
  44.     private int count=0;//记录化成二进制后的位数   
  45.     private long itsTail;//最后算出来的尾数    
  46.     //JAVA中integer对象的值最高为32位   
  47.     //JAVA很不方便的一个地方就是数组必須初始化并只能使用下面的方法赋值   
  48.     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};   
  49.     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};   
  50.        
  51.        
  52. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值