zoukankan      html  css  js  c++  java
  • 数据结构(java语言描述)顺序栈的使用(两个大数相加)

    利用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);
           
       }
    }

  • 相关阅读:
    nginx配置ssl验证
    腾讯云服务器、nginx部署loopback
    mongo删除指定字段,可多个字段同时删除
    前端axios下载excel无法获取header所有字段问题
    本机是wifi,虚拟机无法连接外网问题
    import文件时 ~/ 不识别问题(react)
    监听F5刷新,添加路由前缀
    Django学习笔记(13)model_to_dict 的使用
    Django学习笔记(12)基于前后端分离模式-添加用例接口实现
    Django学习笔记(11)url管理之include
  • 原文地址:https://www.cnblogs.com/xleer/p/5293448.html
Copyright © 2011-2022 走看看