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);
}
}
分享到:
相关推荐
这是自己写的大数相乘与x的y次方大数实现,采用char类型的数组实现。大数相乘的算法还行,但是x^y当y比较大时(比如超过1000)运算速度非常的慢。自己能力有限,但是愿意跟大家分享一下。
大数相乘算法源代码大数相乘算法源代码大数相乘算法源代码大数相乘算法源代码大数相乘算法源代码大数相乘算法源代码大数相乘算法源代码大数相乘算法源代码大数相乘算法源代码大数相乘算法源代码大数相乘算法源代码...
通过汇编语言实现大数相乘,作业,调试成功
分享一下用C/C++实现的大数相加和大数相乘,可以拿来当工具用。
实现了两个大数相乘的小程序,数组大小可自行指定,欢迎大家进行验证
用数组进行大数相乘,解决超整形的大数相乘
大数相乘解决无限位数相乘问题,可以解决工程问题中无限复杂数据相乘难题
C/C++实现两个大数相乘的源代码,同理可以实现两个无限小数的相乘,实现原理都是一样的。看代码就能写出来。
两大数相乘,算法,数组,C语言.。。。。。。
大数相乘大数相乘大数相乘大数相乘大数相乘
20位左右的大数相乘算法解析,用一个整型数组表示一个大数,数组的每个元素储存大数的一位数字,则实际的大数d表示为: d=a[k]*10的k-1次幂+a[k-1]*10的k-2次幂+......+a[2]*10+a[1] 其中a[0]保存该大数的位数. ...
大数相乘,算法源码分析,以及相关的实现
用c实现了大数相乘,详细设计了算法等,可以用于毕业设计
LINUX下的大数相乘汇编程序的设计.pdf
大数相乘的代码及算法解析,希望对需要的人有帮助哦~
在实际的大型的数学相乘运算中,往往数字的位数较多,造成一般计算器乃至科学计算器都无法完成计算,为科学研究和事业带来一定的麻烦,因此为了解决这种普通的计算设备所完成不了的计算,就设计了这个大数相乘程序,...
二个超出计算机数值类型的计算范围的二个数进行运算。用的算法是分治,分治是将大问题逐步简化为一个一个的小问题,先解决小问题,小问题解决完成,大问题也随之解决
两个超过计算机所能表示的数相乘,利用数组存储大数,进行相乘
大数相乘算法,用CSharp实现,经过测试,应该没错了
本程序可以求出:任意位的两个大数相乘的结果。 已经实验过>2000位的两数相乘,有兴趣的话,你也试一试吧。 support me!thanks!