藍橋杯--高精度乘法

輸入一個正整數n,輸出n!的值。
  其中n!=1*2*3*…*n
算法描述
  n!可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用一個數組A來表示一個大整數aA[0]表示a的個位,A[1]表示a的十位,依次類推。
  將a乘以一個整數k變爲將數組A的每一個元素都乘以k,請注意處理相應的進位。

  首先將a設爲1,然後乘2,乘3,當乘到n時,即得到了n!的值。



package com.xjj.lanqiao;

import java.util.Scanner;

/*-----大數據的存儲--高精度乘法
 * 1. 用數組保存大數據:整數的高位存儲在數組的高位,整數的低位存儲在數組的低位
 * 2. 用一結構體:保存數組及長度
 * 3. 將一整數轉換爲數組:
 * 		int a = 100;
		String s = "" + a;
		char[] cs = s.toCharArray();
		int b = cs[0]-'0';
 * 
 * 
 * */
public class Lq2_30 {
	//大數據類
	class bign{
		int[] d = new int[10000];	//保存高精度大數據
		int len = 0;				//高精度大數據的長度,在數組裏++
	}
	bign a = new bign();
	
	//高精度與低精度(基本類型)的乘法
	public bign multi(bign a,int b){
		bign c = new bign();				//臨時保存
		int carry = 0;						//進位
		for(int i = 0; i < a.len; i++){
			//與平時乘法不同,此處始終將b看做一個整體,拆a,每次加其進位
			int temp = a.d[i] * b + carry;
			c.d[c.len++] = temp % 10;		//求模得其個位
			carry = temp / 10;				//求除得其進位
		}
		//乘法進位可能不止一位,需要用循環
		while(carry != 0){
			c.d[c.len++] = carry % 10;
			carry /= 10;
		}
		return c;
	}

	public static void main(String[] args) {
		System.out.println();
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		Lq2_30 lq = new Lq2_30();
		//初始化
		lq.a.d[0] = 1;
		lq.a.len = 1;
		for(int i = 2; i <= n; i++){
			lq.a = lq.multi(lq.a, i);
		}
		//高位到低位讀出
		for(int i = lq.a.len-1; i >= 0; i--)
			System.out.print(lq.a.d[i]);
		
	}

}

發佈了58 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章