中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中超大整數階乘算法的示例分析

發布時間:2021-09-03 14:59:24 來源:億速云 閱讀:110 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關Java中超大整數階乘算法的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

這個方法采用“數組進位”算法。在超越計算機變量取值范圍的情況下,將多位數相乘轉化為一位數相乘。如11!=39916800,若需求12的階乘,則需要將39916800與12相乘,可利用乘法分配率。乘法豎式如下圖所示:

Java中超大整數階乘算法的示例分析

使用一個數組來保存階乘每一位的結果,一個數組元素保存一位數。例如:將11的階乘的結果399
16800保存到數組的8個元素中,要計算12的階乘就用每個數組元素中的值去乘以12,并將結果保存到原來的數組元素中。接下來去判斷每個數組元素是否需要進位,通過進位操作使數組中的每個元素保存的數都只有一位數,示意圖如下:

Java中超大整數階乘算法的示例分析

理論上講,只要計算機內存空間允許就可以保存任意多位的階乘結果,不再受變量的取值范圍的限制,只受到操作系統的尋址能力和計算機內存的限制。友情提示:如果要求的階乘數字很大則可以將數組定義為long類型,以避免在計算單位數的乘積時出現溢出的情況。

實現代碼如下:

public class BigInteger 
{
	/**
	 * 計算進位
	 * @param bit	 數組
	 * @param pos 用于判斷是否是數組的最高位
	 */
	private void carry(int[] bit, int pos)
		{
		int i ,carray = 0;
		for (i = 0 ; i<= pos ;i++)//從0到pos逐位檢查是否需要進位
		{
			bit[i] += carray;
			//累加進位
			if(bit[i] <= 9)	 //小于9不進位
			{
				carray = 0;
			} else if(bit[i] >9 && i<pos)//大于9,但不是最高位
			{
				carray = bit[i]/10;
				//保存進位值
				bit[i] = bit[i]%10;
				//得到該位的一位數
			} else if(bit[i] > 9 && i >= pos)//大于9,且是最高位
			{
				while(bit[i] > 9)//循環向前進位
				{
					carray = bit[i]/10;
					//計算進位值
					bit[i] = bit[i] % 10;
					//當前的第一位數
					i ++ ;
					bit[i] = carray;
					//在下一位保存進位值
				}
			}
		}
	}
	/**
	 * 大整數階乘
	 * @param bigInteger 所計算的大整數
	 */
	private void bigFactorial(int bigInteger)
		{
		int pos =0;
		//
		int digit;
		//數據長度
		int a , b ;
		int m = 0 ;
		//統計輸出位數
		int n = 0 ;
		//統計輸出行數
		double sum = 0;
		//階乘位數
		for (a = 1 ; a <= bigInteger ; a ++)//計算階乘位數
		{
			sum += Math.log10(a);
		}
		digit = (int)sum + 1;
		//數據長度
		int[] fact = new int[digit];
		//初始化一個數組 
		fact[0] = 1;
		//設個位為 1
		for (a = 2 ; a <= bigInteger ; a++ )//將2^bigInteger逐個與原來的積相乘
		{
			for (b = digit-1 ; b >= 0 ; b--)//查找最高位{} 
			{
				if( fact[b] != 0 )
								{
					pos = b ;
					//記錄最高位
					break;
				}
			}
			for (b = 0; b <= pos ; b++)
						{
				fact[b] *= a ;
				//每一位與i乘
			}
			carry(fact,pos);
		}
		for (b = digit-1 ; b >= 0 ; b --)
				{
			if(fact[b] != 0)
						{
				pos = b ;
				//記錄最高位 
				break;
			}
		}
		System.out.println(bigInteger +"階乘結果為:");
		for (a = pos ; a >= 0 ; a --)//輸出計算結果
		{
			System.out.print(fact[a]);
			m++;
			if(m % 5 == 0)
						{
				System.out.print(" ");
			}
			if(40 == m )
						{
				System.out.println("");
				m = 0 ;
				n ++;
				if(10 == n )
								{
					System.out.print("\n");
					n = 0;
				}
			}
		}
		System.out.println("\n"+"階乘共有: "+(pos+1)+" 位");
	}
	public void doBigFactorial(int bigInteger)
		{
		int timeBegin=(int) System.currentTimeMillis();
		this.bigFactorial(bigInteger);
		int timeFinishi=(int) System.currentTimeMillis();
		int time = timeFinishi-timeBegin;
		System.out.println("計算耗時: " + time +"毫秒" );
	}
	public static void main(String[] args)
		{
		BigInteger bi = new BigInteger();
		bi.doBigFactorial(100000);
	}
}

計算10,0000的階乘,顯示結果如下:

Java中超大整數階乘算法的示例分析

這樣的結果,控制臺顯然已經無法保存內容了。10萬的階乘有45萬位之多,這就相當于一本有45萬字的小說一樣。對比1000的階乘結果如下:

Java中超大整數階乘算法的示例分析

控制臺可以完整顯示。

感謝各位的閱讀!關于“Java中超大整數階乘算法的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

杭州市| 河北区| 黎川县| 虹口区| 疏勒县| 揭西县| 衡东县| 行唐县| 梓潼县| 桃江县| 云梦县| 卢湾区| 文成县| 庄浪县| 无棣县| 宜川县| 平顶山市| 丰原市| 永和县| 虞城县| 邯郸县| 绩溪县| 广德县| 武平县| 阿鲁科尔沁旗| 巨野县| 哈尔滨市| 营山县| 上饶市| 萝北县| 同德县| 浪卡子县| 佛坪县| 莱西市| 东乌珠穆沁旗| 五原县| 三原县| 平湖市| 佛山市| 芮城县| 盐城市|