大数计算

 

大数计算:

       由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。

 

大数计算简析:

       大数计算实现的理论是,首先提取输入值赋予指定String字符串。

       通过String.charAt(index)提取每一位的值,赋予int数组.

       然后求相乘每一位的值和进位。

       直到最后每一位都求出来。

 

代码实现:

       

  1 import java.awt.*;
  2 import java.awt.event.ActionEvent;
  3 import java.awt.event.ActionListener;
  4 import javax.swing.*; 
  5 public class DashuCf extends JFrame {
  6     
  7     
  8     JLabel l1=new JLabel("FirstNum ");
  9     JLabel l2=new JLabel("SecondNum");
 10     JLabel l3=new JLabel("Result   ");
 11     JTextField FirstNum = new JTextField(20); 
 12     JTextField SecondNum = new JTextField(20); 
 13     JTextField Result = new JTextField(20); 
 14     JTextField Check = new JTextField(20); 
 15     JButton CountButton = new JButton("Count");     
 16     public static void dS(JTextField a,JTextField b,JTextField c,JTextField d){
 17         
 18         d.setText("");
 19         String fc=a.getText();
 20         String sc=b.getText();
 21         int[] f,s;
 22         f = new int[fc.length()];
 23         s = new int[sc.length()];    
 24         for(int i=0; i<fc.length();i++){
 25                if((int)fc.charAt(i)>=48&&(int)fc.charAt(i)<58)
 26                  f[fc.length()-1-i]=(int)fc.charAt(i)-48;
 27                else
 28                {
 29                    d.setText("The number of FirstNum is invalide!!!");
 30                    return;
 31                }
 32         }
 33        for(int i=0; i<sc.length();i++){
 34             
 35            if((int)sc.charAt(i)>=48&&(int)sc.charAt(i)<58)
 36              s[sc.length()-1-i]=(int)sc.charAt(i)-48;
 37            else
 38            {
 39                d.setText("The number of SecondNum is invalide!!!");
 40                return;
 41            }
 42                
 43         }       
 44        int max=s.length+f.length;
 45        int key=0;
 46        int[] biaoji,out;
 47        biaoji = new int[max+3];
 48        out = new int[max+3];
 49        
 50        for(int i=0;i<max;i++){
 51            biaoji[i]=0;
 52            out[i]=0;
 53        }
 54        
 55        for(int i=0;i<max;i++){
 56            
 57            key=biaoji[i]; 
 58            for(int m=0;m<=i;m++){
 59                
 60                if((m<f.length)&&((i-m)>=0)&&((i-m)<s.length))
 61                key=f[m]*s[i-m]+key;
 62               
 63            }
 64            out[i]=key%10;
 65           biaoji[i+1]=((key-out[i])/10)%10+biaoji[i+1];
 66           biaoji[i+2]=((key-out[i]-out[i+1]*10)/100)%10+biaoji[i+2];
 67           biaoji[i+3]=((key-out[i]-out[i+1]*10-out[i+2]*100)/1000)%10+biaoji[i+3];
 68            
 69        }
 70        String result="";
 71        for(int i=max-1;i>=0;i--){
 72            
 73            if(!(i==max-1&&out[i]==0))
 74            {  
 75                result=result+out[i];}
 76        }
 77        c.setText(result);
 78     }
 79     public DashuCf()  
 80     {                     
 81         CountButton.addActionListener(new CountAction());
 82         Check.setForeground(new Color(108, 2, 10));
 83         setLayout(new GridLayout(0,2,10,5));
 84         setTitle("大数乘法"); 
 85         getContentPane().add(l1);
 86         getContentPane().add(FirstNum);
 87         getContentPane().add(l2);
 88         getContentPane().add(SecondNum);
 89         getContentPane().add(l3);
 90         getContentPane().add(Result);
 91         getContentPane().add(Check);
 92         getContentPane().add(CountButton);      
 93         setSize(600, 200);  
 94         setVisible(true);  
 95     } 
 96 class CountAction implements ActionListener {
 97         
 98         public void actionPerformed(ActionEvent e) {
 99             dS(FirstNum,SecondNum,Result,Check);
100         }
101     }
102 
103 public static void main(String argv[]){
104     new DashuCf();
105 }
106 
107 }

 

效果演示:

 

                                   输入正确的数值

 

                                  输入非法数值时

 

posted @ 2014-12-10 15:31  UDLD  阅读(279)  评论(0编辑  收藏  举报