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); } }