两个超长正整数的加法

题目描述:

     * 题目描述:请设计一个算法完成两个超长正整数的加法。 
要求实现函数:
  void AddLongInteger(char * pcAddend, char * pcAugend, char * pcAddResult);
输入参数:
        char * Addend:加数
        char * Augend:被加数
        char * AddResult:加法结果
返回值:无

输入:
两个超长正整数的字符串
输出:
相加后结果的字符串
样例输入:
123456789123456789 123456789123456789
样例输出:
246913578246913578


代码实现:

import java.util.Arrays;
import java.util.Scanner;

/**
 * 题目描述:请设计一个算法完成两个超长正整数的加法。 
要求实现函数:
  void AddLongInteger(char * pcAddend, char * pcAugend, char * pcAddResult);
输入参数:
        char * Addend:加数
        char * Augend:被加数
        char * AddResult:加法结果
返回值:无
 *
 */
public class SuperLongNumAdd {

	public static char[] toSameLength(char[] lessCharArr,int length,int dis){
		int j=0;
		char[] temp=new char[length];
		for (int i = 0; i < length; i++) {
			if(i<dis)
				temp[i]=48;
			else{
				temp[i]=lessCharArr[j];
				j++;
			}
		}
		return temp;
	}
	
	
	public static String AddLongInteger(String pcAddend,String pcAugend){
		if(pcAddend==null||pcAugend==null)
			return null;
		char[] Addend=pcAddend.toCharArray();
		char[] Augend=pcAugend.toCharArray();
		char[] AddResult;
		int length1=Addend.length;
		int length2=Augend.length;
		int length=length1>length2?length1:length2;
		char[] temp=new char[length];
		AddResult=new char[length];
		if(length1>=length2){
			Augend=toSameLength(Augend,length,length1-length2);
		}else{
			Addend=toSameLength(Addend,length,length2-length1);
		}
		//相加
		int add=0;//进一位
		temp=new char[length+1];
		int i=0;
		temp[0]=48;
		for (i = temp.length-1; i >=0; i--) {
			if(i-1==-1&&add==0)
				break;
			else if(i-1==-1&&add==1){
				 temp[i]=49;
				 break;
				}
			int a=Augend[i-1]-48;
			int b=Addend[i-1]-48;
			int result=a+b;
			//进位
			if(add==1){
				result+=1;
			}
			if(result>=10){
				add=1;
				temp[i]=(char) ((result-10)+48);
			}else{
				add=0;
				temp[i]=(char) (result+48);
			}
		}
		if(temp[0]!=48){
			AddResult=temp;
		}else{
			AddResult=Arrays.copyOfRange(temp, 1, temp.length);
		}
		
		String pcAddResult=String.valueOf(AddResult);
		return pcAddResult;
	}
	
	
	public static boolean validInput(String input){
		if(input==null||"".equals(input))
			return false;
		for (int i = 0; i < input.length(); i++) {
			if(input.charAt(i)<48||input.charAt(i)>57)
				return false;
		}
		return true;
	}
	
	public static void main(String[] args) {
		String Addend; 
		String Augend; 
		String AddResult; 
		Scanner cin=new Scanner(System.in);
		Addend=cin.next();
		Augend=cin.next();
		cin.close();
		if(validInput(Addend)&&validInput(Augend)){
			AddResult=AddLongInteger(Addend,Augend);
			System.out.println(AddResult);
		}
		return;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值