62,614
社区成员
发帖
与我相关
我的任务
分享
/** */
/**
* 大整数项乘
* @author seven
*
*/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.math.*;
public class Test1 {
public static void main(String[] args) {
Test1 t1 = new Test1();
long x, y;
System.out.println("Input x ");
x = t1.getNumFromConsole();
System.out.println("x:" + num(x) + "位数");
System.out.println("Input y ");
y = t1.getNumFromConsole();
System.out.println("x:" + num(y) + "位数");
System.out.println(t1.mult(x, y, num(x)));
}
public long getNumFromConsole() {
String str = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
str = br.readLine();
} catch (IOException e) {
System.out.println(e.getMessage());
}
return Long.parseLong(str);
}
public long mult(long x, long y, int n) {
long a, b, c, d, s;
int e;
if (n == 1)
return x * y;
else {
a = (long) (x / Math.pow(10, n / 2));// 取x左半部分
b = (long) (x % Math.pow(10, n / 2));// 取x的又半部分
c = (long) (y / Math.pow(10, n / 2));// 取y的左半部分
d = (long) (y % Math.pow(10, n / 2));
e = num(a);
s = (long) (mult(a, c, e)
* Math.pow(10, n)
+ (mult((a - b), (d - c), e) + mult(a, c, e) + mult(b, d, e))
* Math.pow(10, n / 2) + mult(b, d, e));
return s;
}
}
// 判断输入数字的位数
private static int num(long x) {
int i = 0;
if (x - 9 <= 0)
return 1;
else {
while (x != 0) {
i++;
x = x / 10;
}
return i;
}
}
}
BigInteger n=new BigInteger("12345475464654412546"),
m=new BigInteger("54687614546547687");//定义2个大整数
System.out.println(n.multiply(m));
public class Factory {
public static void main(String[] str){
int[] result = new int[10000];
int digits =1;
result[0] = 1;
for(int i = 2; i <= 100;i++){
digits = mul(result, digits, i);
}
System.out.println(toString(result, digits));
}
static int mul(int[] array, int digits, int n){
int more = 0;
for(int i = 0;i < digits;i++){
more = more + array[i]*n;
array[i] = more % 10;
more = more / 10;
}
while(more > 0){
array[digits++] = more % 10;
more = more / 10;
}
return digits;
}
static String toString(int[] array, int digits){
String result = "";
for(int i = digits - 1;i >= 0;i--){
result = result + array[i];
}
return result;
}
}
//大数相加与大数相乘,大数阶乘
import java.util.*;
public class tt {
public static void main(String args[])
{
// System.out.print( bigAdd(null,"1123123123123132"));
// System.out.print(bigJie(10));
// System.out.print(Jie(2000));
// System.out.print(cheng("123123123123123123123","200"));
// System.out.print(bigJian("123456123456789","445645645645"));
System.out.print(bigChu("123456789123","11231223"));
}
/*
大数相减,若a>b则用a的每一位减b,否则用b-a,最后前面加负号
然后判断每一位的正负,负数则取10+此数,上一位-1;
*/
public static String bigChu(String a,String b )
{
if(a==null) a="";
if(b==null) b="";
int temp=0;
int[] array1=new int[9000];
int[] array2=new int[9000];
int[] array3=new int[9000];
String result="";
while(bigJian(a,b).charAt(0)!='-')
{
result=bigAdd(result,"1");
a=bigJian(a,b);
}
result+=" mod "+a;
return result;
}
public static String bigJian(String a,String b)
{
if(a==null) a="";
if(b==null) b="";
int temp=0;
boolean blag;
if(a.length()>b.length())
{
blag=true;
}
else
{
if(a.length()==b.length())
{
if(a.compareTo(b)>=0)
{
blag=true;
}
else
{
blag=false;
}
}
else
{
blag=false;
}
}
int[] array1=new int[9000];
int[] array2=new int[9000];
int[] array3=new int[9000];
String result="";
//把两个串分别放在数组中
for(int i=0;i<a.length();i++)
{
array1[9000-a.length()+i]=Integer.parseInt(Character.toString(a.charAt(i)));
}
for(int i=0;i<b.length();i++)
{
array2[9000-b.length()+i]=Integer.parseInt(Character.toString(b.charAt(i)));
}
//每一位分别相减
for(int i=0 ;i<array3.length;i++)
{
if(blag)
{
array3[i]=array1[i]-array2[i];
}
else
{
array3[i]=array2[i]-array1[i];
}
}
for(int i=array3.length-1;i>temp;i--)
{
if(array3[i]<0)
{
array3[i]+=10;
array3[i-1]-=1;
}
}
for(int i=0;i<9000;i++)//去掉数组前的0000
{
if(array3[i]!=0)
{
temp=i;
break;
}
if(i==8999)
{
return "0";
}
}
if(!blag)
{
result="-";
}
for (int i=temp;i<9000 ;i++ )
{
result+=array3[i];
}
return result;
}
public static String bigAdd(String a,String b)
{
if(a==null) a="";
if(b==null) b="";
int temp=0;
int[] array1=new int[9000];
int[] array2=new int[9000];
int[] array3=new int[9000];
String result="";
//把两个串分别放在数组中
for(int i=0;i<a.length();i++)
{
array1[9000-a.length()+i]=Integer.parseInt(Character.toString(a.charAt(i)));
}
for(int i=0;i<b.length();i++)
{
array2[9000-b.length()+i]=Integer.parseInt(Character.toString(b.charAt(i)));
}
//每一位分别相加
for(int i=0 ;i<array3.length;i++)
{
array3[i]=array1[i]+array2[i];
}
//进位,上一位=上一位+当前位/10
// 当前位=当前位%10
for(int i=array3.length-1;i>0;i--)
{
array3[i-1]+=array3[i]/10;
array3[i]=array3[i]%10;
}
for(int i=0;i<9000;i++)//去掉数组前的0000
{
if(array3[i]!=0)
{
temp=i;
break;
}
if(i==8999)
{
return "0";
}
}
for (int i=temp;i<9000 ;i++ )
{
result+=array3[i];
}
return result;
}
//大数*非大数
/*
* b*a就是b个a想加,循环调用加法;
*/
public static String cheng(String a,int b)
{
String result="";
for(int i=0;i<b;i++)
{
result=bigAdd(result,a);
}
return result;
}
//大数*大数
/*
* 用b的每一位分别乘a,得到的数再最后加上相应个数的0
* 存在数组temp中,再让temp的每个元素相加得到结果
*/
public static String cheng(String a,String b)
{
String[] temp=new String[b.length()];
String result="";
for(int i=0;i<b.length();i++)
{
temp[i]=cheng(a,Integer.parseInt(Character.toString(b.charAt(i))));
for(int j=0;j<b.length()-i-1;j++)
{
temp[i]+="0";
}
}
for(int i=0;i<temp.length;i++)
{
result=bigAdd(result,temp[i]);
}
return result;
}
public static String Jie(int b)
{
String result="";
int temp=0; //用于最后去掉整个数组中的前面没用的 0
int tt=0; //用于记录每次乘的进位数;
int[] a=new int[9000]; //
a[8999]=1; //把数组最后一位设为了1,从最后一位开始乘,
for(int i=1;i<=b;i++) //用从 1 到 b 的每一个数去乘数组的每个元素,
{
for(int j=8999;j>=0;j--)
{
a[j]=a[j]*i+tt; //数组中的元素=原来的数*i+进位数,
tt=0; //进位数清0,用于下回记录;
if((a[j]+"").length()>=2) //此元素大于10则进位,本身只保留余数;
{
tt=a[j]/10;
a[j]=a[j]%10;
}
}
}
for(int i=0;i<a.length;i++)//去掉数组前的0000
{
if(a[i]!=0)
{
temp=i;
break;
}
if(i==8999)
{
return "0";
}
}
for(int i=temp;i<a.length;i++)//输出
{
result+=a[i];
}
return result;
}
}