标签:
利用http://www.cnblogs.com/xleer/p/5289661.html中对顺序栈以及栈的进本方法的定义,实现超过整数上限的两个数的加法计算。
算法:
package stack;
/**********************************************************************
* @author sch
********利用栈,计算两个大数的和。大数的值超过int存储的范围*******************
********************************************************************* */
import java.util.Scanner;
import java.math.*;
public class Sumdata {
public String add(String a,String b)throws Exception{
int l1=a.length();
int l2=b.length();
int l3=0;
if(l1>l2)
l3=l1+1;
else
l3=l2+1;
sqstack sum=new sqstack(l3);
sqstack sa=numsplit(a);//将家数以字符的形式入栈
sqstack sb=numsplit(b);
int partialsum;
boolean iscarry=false;
while(!sa.isEmpty()&&!sb.isEmpty())
{//加数和非加数同时非空则入栈
partialsum=(Integer)sa.pop()+(Integer)sb.pop();//计算栈顶元素之和
if(iscarry)
{
partialsum++;
iscarry=false;
}//先判断是否进位,并对partialsum做处理
if(partialsum>=10)
{//分情况对partialsum做进栈处理
partialsum-=10;
sum.push(partialsum);
iscarry=true;
}
else
{
sum.push(partialsum);
}
}
sqstack temp=!sa.isEmpty()?sa:sb;//引用指向加数和被加数中非空栈
while(!temp.isEmpty())
{//分情况,如若两个栈中只有一个非空
if(iscarry)
{//若果此时仍存在进位
int t=(Integer)temp.pop();
++t;
if(t>=10)
{
t-=10;
sum.push(t);
//iscarry=true;
}else
{
sum.push(t);
iscarry=false;//此时不存在进位,将进位置为0
}
}else//此时iscarry为false,不需要进位,进行while的下一轮判断
sum.push(temp.pop());//最后依次执行加法时不需要进位,把加数或被加数的值放入和的栈中
}//while的判断
if(iscarry){//最高位,即两个栈都为空后,的进位进sum栈
sum.push(1);
}
String str=new String();
while(!sum.isEmpty())//将asum栈中的值全部抛出转换为string
str=str.concat(sum.pop().toString());
return str;
}//至此,做和的算法完毕
public sqstack numsplit(String str)throws Exception{//对输入的字符做入栈操作
sqstack s=new sqstack(str.length());
for(int i=0;i<str.length();i++){
char c=str.charAt(i);
if(‘ ‘==c)
continue;
else if(‘0‘<=c&&‘9‘>=c){
s.push(Integer.valueOf(String.valueOf(c)));
}else
throw new Exception("错误:输入了非数字型的字符!");
}
return s;
}
public static void main(String[] args)throws Exception{
Scanner sc=new Scanner(System.in);
System.out.println("请输入您要计算的两个整数:");
String a=sc.next();
String b=sc.next();
Sumdata e=new Sumdata();
String sum=e.add(a, b);
System.out.println("两个大数的和为:"+sum);
}
}
标签:
原文地址:http://www.cnblogs.com/xleer/p/5293448.html