大数相乘,次方,X的Y次方

阅读更多
package com.luoyh.gram;

import java.math.BigInteger;

public class Program005 {
	//如何求919的230次方?
	
	public static void main(String[] args) {
		//3652309885822188847156289172384812657813091020334632766118353221968146408065431953413226496752584529397107234066579567598901542744375869645822596223408199506319443774384955374065650217156614442984807614315760059451457689078438582959976943724202574123383020597107659309089090474641361928303566529583439123520587517644476193675997378768727047531780293350975631065789714975421669066227322639816687426611300838818559671973514750497935791414555528625455885997463225263669876781079601430278062359662278314276970690912086194326127239857799763118635568381269828287560680427424163886926617693838337423787844655026719803501949002238962256268054128761071850464006991147941247244049176438852401
		//3652309885822188847156289172384812657813091020334632766118353221968146408065431953413226496752584529397107234066579567598901542744375869645822596223408199506319443774384955374065650217156614442984807614315760059451457689078438582959976943724202574123383020597107659309089090474641361928303566529583439123520587517644476193675997378768727047531780293350975631065789714975421669066227322639816687426611300838818559671973514750497935791414555528625455885997463225263669876781079601430278062359662278314276970690912086194326127239857799763118635568381269828287560680427424163886926617693838337423787844655026719803501949002238962256268054128761071850464006991147941247244049176438852401
		BigInteger b2 = new BigInteger("919");
		BigInteger bb = b2.pow(230);
		System.out.println(bb);
		System.out.println(pow("919", "919", 230));
		System.out.println((pow("919", "919", 230)).equals(bb.toString()));
	}
	
	/**
	 * 求num2的len次方
	 * 注意,调用次方方法,num1必须等于num2
	 * @author luoyh
	 * 
	 * @param num1 
	 * @param num2
	 * @param len 多少次方
	 * @return 结果字符串
	 */
	public static String pow(String num1, String num2, int len) {
		if(len <= 1) 
			return num1;
		len --;
		return pow(mul(num1, num2), num2, len);
		
	}
	
	/**
	 * 把数组倒序转换字符串,并去掉转换后的首位为0
	 * @author luoyh
	 * 
	 * @param arr 要转换的数组
	 * @return 倒序并去0的字符串
	 */
	public static String cc(int arr[]) {
		String info = "";
		int len = arr.length - 1;
		while(true) {
			if(len < 0)
				break;
			info += arr[len];
			len --;
		}
		while(true) {//去掉首位字符0
			if(info.length() == 1 && info.equals("0")) // 如果为0就结束
				break;
			if(info.charAt(0) == '0') 
				info = info.substring(1);
			else
				break;
		}
		return info;
	}
	/**
	 * 2个大数相乘
	 * @author luoyh
	 * 
	 * @param num1 数值1
	 * @param num2 数值2
	 * @return 返回num1 * num2 的字符串
	 */
	public static String mul(String num1, String num2) {
		boolean isMax = num1.length() >= num2.length();
		
		int len1 = num1.length() - 1;
		int len2 = num2.length() - 1;
		int arr1[] = new int[num1.length()];
		int arr2[] = new int[num2.length()];
		int arr[] = new int[isMax ? arr1.length * 2 : arr2.length * 2];
		int index = 0;
		while(true) {
			if(len1 < 0)
				break;
			arr1[index] = num1.charAt(len1) - '0';
			len1 --;
			index ++;
		}
		index = 0;
		while(true) {
			if(len2 < 0)
				break;
			arr2[index] = num2.charAt(len2) - '0';
			len2 --;
			index ++;
		}
		for(int i = 0; i < arr1.length; i ++) {
			for(int j = 0; j < arr2.length; j ++) {
				//example: 1234 * 123 最开始arr=[0,0,0,0,0,0,0,0];
				//首先拿4 * 1 | 2 | 3 , 放到arr的0,1,2索引处 [12,8,4,0,0,0,0,0]
				//然后拿3 * 1 | 2 | 3 , 放到arr的1,2,3索引处 [12,8+9,4+6,0+3,0,0,0,0]
				//...
				// 最后得到 arr = [12,17,16,10,4,1,0,0];
				arr[j + i] += arr1[i] * arr2[j]; 
			}
		}
		for(int i = 0 ; i < arr.length; i ++) {
			if(arr[i] > 9) {
				// arr = [12,17,16,10,4,1,0,0];
				// 首先得设置下一个数的值等于原值加上这个值进位的数值
				// 比如 [12,17,...],设置后为[2,17+(12/10=1)=18,...],
				// [1234,321,...] --> [1234%10=4, 321+(1234/10=123)=444,...]
				arr[i + 1] = arr[i + 1] + arr[i] / 10;
				arr[i] = arr[i] % 10;
			}
		}
		
		return cc(arr);
	}
}

你可能感兴趣的:(java,BigInteger)