阅读更多
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);
}
}