大数计算
大数计算:
由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。
大数计算简析:
大数计算实现的理论是,首先提取输入值赋予指定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 }
效果演示:
输入正确的数值
输入非法数值时