首页 > 代码库 > 重温当年入门战之大数计算

重温当年入门战之大数计算

 

大数计算:

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

 

大数计算简析:

       大数计算实现的理论是,首先提取输入值赋予指定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 }

 

效果演示:

 

                                   输入正确的数值

 

                                  输入非法数值时

 

重温当年入门战之大数计算