大数运算

说明:

       基于内存的有效运用,程序语言中规定了各种不同的数据型态,也因此变量所可以表达的最大整数受到限制,例如123456789123456789这样的整数就不可能储存在long变量中(例如C/C++等),我们称这为long数,这边翻为超长整数(避免与数据型态的长整数翻译混淆),或俗称大数运算。

解法:

        一个变量无法表示超长整数,则就使用多个变量,当然这使用数组最为方便,假设程序语言的最大数据型态可以储存至65535的数好了,为了计算方便及符合使用十进制制的习惯,让每一个数组元素可以储存四个位数,也就是09999的数,例如:

大数运算_第1张图片


      很多人问到如何计算像50!这样的问题,解法就是使用程序中的乘法函式,至于要算到多大,就看需求了。
       如果您使用的是Java,那么在java.lang下有BigIntegerBigDecimal可以直接进行大数运算。
      由于使用数组来储存数值,关于数值在运算时的加减乘除等各种运算、位数的进位或借位就必须自行定义,加、减、乘都是由低位数开始运算,而除法则是由高位数开始运算,这边直接提供加减乘除运算的函式供作参考,以下的N为数组长度。

package BigNumber;
/**
 * 大数运算:采用数组实现
 * @author xcbeyond
 * @date 2012-4-27 上午09:20:32
 */
public class BigNumber {
	public static void main(String[] args) {
		 int[] a = {1234, 5678, 9910, 1923, 1124}; 
		 int[] b = {1234, 5678, 9910, 1923, 1124};
		 int[] c = BigNumber.add(a, b);
		 
		 for(int i = 0; i < c.length; i++) {
			 System.out.print(c[i]);
		 }        
		 System.out.println();
	}
	//加法
	public static int[] add(int[] a, int[] b) {
		int carry = 0;
		int[] c = new int[a.length];
		
		for(int i = a.length - 1; i >= 0; i--) {
			c[i] = a[i] + b[i] + carry;
			if(c[i] < 10000)
				carry = 0;
			else { // 进位
				c[i] -= 10000;
				carry = 1;         
			}
		}
		return c;
	} 
	//减法
	public static int[] subtract(int[] a, int[] b) {  
		int borrow = 0;       
		int[] c = new int[a.length];     
		for(int i = a.length - 1; i >= 0; i--) {   
			c[i] = a[i] - b[i] - borrow;        
			if(c[i] >= 0)             
				borrow = 0;          
			else { // 借位               
				c[i] += 10000;    
				borrow = 1;       
				}      
			}            
		return c;  
		} 
	//乘法			
	 public static int[] multiply(int[] a, int b) {// b 位乘数  
		 int carry = 0;      
		 int[] c = new int[a.length];      
		 for(int i = a.length - 1; i >=0; i--) {    
			 int tmp = a[i] * b + carry;    
			 c[i] = tmp % 10000;       
			 carry = tmp / 10000;     
		  }             
		 return c;  
	 } 
	 //除法
	 public static int[] divide(int[] a, int b) {  // b 为除数
		 int remain = 0;       
		 int[] c = new int[a.length];   
		 for(int i = 0; i < a.length; i++) {    
			 int tmp = a[i] + remain;       
			 c[i] = tmp / b;        
			 remain = (tmp % b) * 10000;    
		 }             
		 return c;   
	}
}

你可能感兴趣的:(java,c,Date,String,Class,语言)