package com.lyj.calculate; import java.math.BigDecimal; public class BigInteger { /** * * @param number1数字1 * @param number2数字2 *大整数相乘优化了 * * @return */ public static String mutiply(String number1,String number2){ int len1=number1.length(); int len2=number2.length(); final int []number=new int[len1+len2];//定义一个长度为两个数字长度之和的数组用来存储计算结果 int max=len1>len2?len1:len2; int min=max==len1?len2:len1; String maxStr=len1>len2?number1:number2; String minStr=maxStr==number2?number1:number2; int carryFlag=0;//进位标记 int cusor=number.length-1;//数组移动游标 int index=0; char []bigChar=maxStr.toCharArray(); char []smallChar=minStr.toCharArray(); for(int i=min-1;i>=0;i--){ int big=new Integer(smallChar[i]+""); index=cusor; carryFlag=0; for(int j=max-1;j>=0;j--){ int small=new Integer(bigChar[j]+"");; int result=(big*small+number[index]+carryFlag); carryFlag=result/10; number[index]=result%10; index--; } cusor--; number[index]=carryFlag; } return toString(number); } /** * 两个大整数相加 * @param number1 * @param number2 * @return */ public static String Add(String number1,String number2){ int len1=number1.length(); int len2=number2.length(); int max=len1>len2?len1:len2; int min=max==len1?len2:len1; String maxStr=len1>len2?number1:number2; final int []number=new int[max+1];//定义一个长度为两个数字长度之和的数组用来存储计算结果 String minStr=maxStr==number2?number1:number2; int carryFlag=0;//进位标记 int cusor=number.length-1;//数组移动游标 char []bigChar=maxStr.toCharArray(); char []smallChar=minStr.toCharArray(); int index=min-1; for(int j=max-1;j>=0;j--){ int big=new Integer(bigChar[j]+""); if(index>=0){ int small=new Integer(smallChar[index]+""); int result=(big+small+number[cusor]+carryFlag); carryFlag=result/10; number[cusor]=result%10; index--; } else{ int result=(big+carryFlag); carryFlag=result/10; number[cusor]=result%10; } cusor--; } return toString(number); } /** * 两个大整数相减 * @param number1 * @param number2 * @return */ public static String reduce(String number1,String number2){ int len1=number1.length(); int len2=number2.length(); int max=len1>len2?len1:len2; int min=max==len1?len2:len1; String maxStr=len1>len2?number1:number2; final int []number=new int[max];//定义一个长度为两个数字长度之和的数组用来存储计算结果 String minStr=maxStr==number2?number1:number2; int borrowFlag=0;//借位标记 int cusor=number.length-1;//数组移动游标 char []bigChar=maxStr.toCharArray(); char []smallChar=minStr.toCharArray(); int index=min-1; for(int j=max-1;j>=0;j--){ int big=new Integer(bigChar[j]+"")-borrowFlag; if(index>=0){ int small=new Integer(smallChar[index]+""); int result=(big-small)<0?big+10-small:big-small; borrowFlag=(big-small)<0?1:0; index--; number[cusor]=result; } else{ int result=(big-borrowFlag)<0?big+10-borrowFlag:big-borrowFlag; borrowFlag=(big-borrowFlag)<0?1:0; number[cusor]=result; } cusor--; } return toString(number); } public static String toString(int []number){ StringBuilder numBulider=new StringBuilder(number.length); for(int len=number.length,i=0;i<len;i++){ if(number[i]==0&&i==0){ continue; } numBulider.append(number[i]); } return numBulider.toString(); } /** * 判断是否是回文 * @param str * @return */ public static boolean isHuiWen(String s){ for(int i=0,len=s.length(),j=len-1;i<len/2;i++,j--){ char head=s.charAt(i); char bottom=s.charAt(j); if(head!=bottom){ return false; } } return true; } private static String maxStr="";//最长字符标记串 private static String longest=""; /** * 递归遍历最长回文串 * @param in * @param start * @param end * @param length */ static void printAllChar(String in, int start, int end,int length){ if(end>=start) maxStr=in.substring(start,end); boolean ishui=isHuiWen(maxStr.trim()); if(ishui){ if(maxStr.length()>1 &&maxStr.length()>=longest.length()){ longest=maxStr; } } if(end>=1){ printAllChar(in,start,end-1,length); } if(end==1&&start<length-1){ printAllChar(in,start+1 , length, length); } } /** * 取得最长回文串 * @return */ public static String getMaxString(){ return longest.toString(); } public static void main(String[] args) { System.out.println(reduce("1111", "1699")); String s=""; //String huiwen="1123xxxxxxxxxxxxxxxxxxxxxx3211bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb3211"; System.out.println(s.length()); System.out.println(mutiply("11111111999999999999999999999991111111199999999999111111119999999999999999999999911111111999999999999999999111111119999999999999999999999911111111999999999991111111199999999999999999999999111111119999999999999999999999999999999999999991111111199999999999999999999999111111119999999999911111111999999999999999999999991111111199999999999999999999999999999999999999911111111999999999999999999999991111111199999999999111111119999999999999999999999911111111999999999999999999999999999999999999999999999999999999999999", "1111111199999999999999999999999111111119999999999911111111999999999999999999999991111111199999999999999999999999999999999999999911111111999999999999999999999991111111199999999999111111119999999999999999999999911111111999999999999999999999999999999999999999")); System.out.println(new BigDecimal("11111111999999999999999999999991111111199999999999111111119999999999999999999999911111111999999999999999999999999999999999999999").multiply(new BigDecimal("999999999999999999999999")).doubleValue()); } }

年年有风 LV1
2022年3月7日
Bsword LV2
2022年2月16日
1825900113 LV2
2021年12月30日
大兴西北 LV2
2020年12月13日
18259242926 LV1
2020年7月26日
wsk588 LV26
2019年12月18日
chenhuahao LV18
2019年12月17日
忠于生物 LV1
2019年7月11日
xuzijian LV1
2019年5月15日
光道一 LV2
2019年3月25日

sunlea LV20
2024年5月8日
ClydeSon LV5
2023年12月27日
四十四十 LV3
2023年10月18日
别以为长得帅就不打你 LV5
2023年6月8日
wuziayng1232 LV10
2023年2月20日
heqian LV17
2022年12月2日
九千风云 LV1
2022年10月10日
wadadd LV7
2022年9月5日
林间听风 LV10
2022年6月27日
2213795250 LV3
2022年3月22日