• K:大数加法


    相关介绍:

     在java中,整数是有最大上限的。所谓大数是指超过整数最大上限的数,例如18 452 543 389 943 209 789 324 233和8 123 534 323 432 323 432 123 212 443就是两个大数,在java中这是无法用整型int变量或长整型long变量来进行保存的,更不用说保存他们之间相加的和了。为解决该问题,可以把两个相加数看成是字符串,将这些数的相应数字存储在两个堆栈中,并从两个栈中弹出对应位的数字依次执行加法可得到结果,以784和8465为例进行加法的计算过程。

    784和8465的加法过程

    对于两个大数的加法,其操作步骤归纳如下:

    1. 将两个加数的相应位从高位到低位依次压入栈sA和sB中。
    2. 若两个加数栈都非空,则依次从栈中弹出栈顶数字相加,和存入变量partialSum中,若和有进位,则将和的个位数压入结果栈sum中,并将进位数加到下一位数字相加的和中,若和没有进位,则直接将和压入结果栈sum中
    3. 若某个加数堆栈为空,则将非空加数栈中的栈顶数字依次弹出与进位相加,和的个位数压入结果栈sum中,直到此该栈为空为止,若最高位有进位,则最后将1压入栈sum中
    4. 若两个加数栈都为空,则栈sum中保存的就是计算结果。注意栈顶是所得计算结果的最高位

    其代码如下:

    package queueandstack;
    import java.util.Stack;
    /**
     * 该类用于演示大数加法的相关代码
     * @author 学徒
     *
     */
    public class BigNumberAdd
    {
    	/**
    	 * 求两个大数的和,加数与被加数以字符串的形式输入(允许大数中出现空格),计算的结果也以字符串的形式返回
    	 */
    	public String add(String number1,String number2)throws Exception
    	{
    		Stack result=new Stack();//大数的和
    		Stack number1Stack=numberSplit(number1);//加数字符串以单个字符的形式放入栈中
    		Stack number2Stack=numberSplit(number2);//被加数字符串以单个字符的形式放入栈中
    		int partialSum;//对于两个位的求和
    		boolean isCarry=false;//进位标志
    		while(!number1Stack.isEmpty()&&!number2Stack.isEmpty())//加数和被加数栈同时非空
    		{
    			partialSum=(Integer)number1Stack.pop()+(Integer)number2Stack.pop();//对于两个位进行求和,并在栈中去除掉加数和被加数中的该位
    			//当有低位的进位时
    			if(isCarry)
    			{
    				partialSum++;
    				isCarry=false;
    			}
    			//需要进行进位
    			if(partialSum>=10)
    			{
    				partialSum-=10;
    				isCarry=true;
    			}
    			//将本位的结果放入结果栈中
    			result.push(partialSum);
    		}
    		Stack temp=!number1Stack.isEmpty()?number1Stack:number2Stack;//将temp引用指向加数和被加数中非空栈
    		while(!temp.isEmpty())
    		{
    			//当最后一次加法运算中存在进位的时候
    			if(isCarry)
    			{
    				int t=(Integer)temp.pop();//取出其中的加数或者被加数中没有参加的位
    				++t;//进位加到此位上
    				if(t>=10)//当其需要进行进位的时候
    				{
    					t-=10;
    				}
    				else//重置其进位标志
    				{
    					isCarry=false;
    				}
    				result.push(t);
    			}
    			else//最后一次执行加法运算中不需要进位
    			{
    				result.push(temp.pop());//把加数或者被加数中非空的值放入和中
    			}
    		}
    		if(isCarry)//将最高位加入到结果中
    		{
    			result.push(1);
    		}
    		String resultstr=new String();
    		while(!result.isEmpty())
    		{
    			//把栈中的元素转化为字符串
    			resultstr=resultstr.concat(result.pop().toString());
    		}
    		return resultstr;
    	}
    	
    	/**
    	 * 该方法用于将输入的大数拆分成单个的字符,并去掉字符串中的空格,返回以单个字符为元素的栈
    	 * 
    	 */
    	public Stack numberSplit(String str)throws Exception
    	{
    		Stack result=new Stack();
    		for(int i=0;i<str.length();i++)
    		{
    			char c=str.charAt(i);//指定索引处的char值
    			if(' '==c)//去除掉空格
    				continue;
    			else if('0'<=c&&'9'>=c)//将数字放入栈中
    				result.push(Integer.valueOf(String.valueOf(c)));
    			else
    				throw new Exception("错误:输入了非数字型的字符!");
    		}
    		return result;
    	}
    	/**
    	 * 用于测试程序
    	 */
    	public static void main(String[] args)throws Exception
    	{
    		BigNumberAdd a=new BigNumberAdd();
    		System.out.println("两个大数为:");
    		System.out.println("1. 18 452 543 389 943 209 752 345 473");
    		System.out.println("2. 8 123 542 678 432 986 899 334");
    		System.out.println("其和为:");
    		System.out.println(a.add("18 452 543 389 943 209 752 345 473", "8 123 542 678 432 986 899 334"));
    	}
    }
    
    
    运行结果:
    两个大数为:
    1. 18 452 543 389 943 209 752 345 473
    2. 8 123 542 678 432 986 899 334
    其和为:
    18460666932621642739244807
    
    

    回到目录|·(工)·)

  • 相关阅读:
    小程序(1)
    手机端放在线条中间的标题
    不定长度导航的两端对齐
    扇形导航菜单
    个性搜索框
    javascript数组原型方法
    jquery插件开发的demo
    监听表单中的内容变化
    mui中的关闭页面的几种方法
    css之伪类选择器:before :after(::before ::after)
  • 原文地址:https://www.cnblogs.com/MyStringIsNotNull/p/8206746.html
Copyright © 2020-2023  润新知