首页>代码>java实现简单的四则运算>/calculate/src/com/lyj/calculate/BigInteger.java
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日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友