使用数组实现过大的非零整数的加法计算(java)

/* 日期:2016年10月14日
 * 作者:肖庆鸿(Eric)
 * 程序版本1.0
 * 程序功能:使用数组实现过大的非零整数的加法计算
 * */

package com.Eric;

import java.util.Scanner;

public class ArrayCalPlus
{
    private static Scanner sc;
    public static void main(String[] args)
    {
        sc = new Scanner(System.in);
        //输入加数
        System.out.println("请输入加数:");
        String a = input();
        //输入被加数
        System.out.println("请输入被加数:");
        String b = input();
        //计算
        int length = a.length()>b.length()?a.length():b.length();
        int[] res = new int[length];
        res = Calplus(a, b);
        //打印结果
        dis(res);
        sc.close();
    }
    //输入(方法)
    private static String input()  
    {
        String s = new String();
        s = sc.next();
        return s;
    }
    //计算(方法)
    private static int[] Calplus(String a, String b)
    {
        char[] first_1 = a.toCharArray();
        char[] second_1 = b.toCharArray();
        char[] first = new char[first_1.length];
        char[] second = new char[second_1.length];
        int[] res = new int [(first_1.length>second.length?first_1.length:second_1.length)+1];
        first = InvertedArrary(first_1);
        second = InvertedArrary(second_1);
        res = Plus(first, second); //两个数组相加
        //int res = CharToInt(first[0])+CharToInt(second[0]);
        //System.out.println(res);
        return res;  //返回int型数组
    }

    //加法计算
    private static int[] Plus(char[] first, char[] second)
    {
        int len = (first.length>second.length?first.length:second.length); //找到最长的长度
        int r = 0;
        int[] res_1 = new int[first.length];
        int[] res_2 = new int[second.length];
        res_1 = CharToInt(first); //将字符串数组转换为int型数组
        res_2 = CharToInt(second); //将字符串数组转换为int型数组
        int[] res = new int[len+1];  //res[]用于承接结果数组
        for (int k = 0; k < res.length; k++) //将用于承接结果的数组全元素赋值为0
        {
            res[k] = 0;
        }
        if(first.length> second.length)  //若第一个数组更长时, 则for循环的终止条件由第一个长度控制
        {
            for (int i = 0, j = 0; i < first.length; i++, j++)
            {
                if(j >= second.length)  //当短的数组全部读完,长的数组没读完,则短取0参与计算
                {
                    r = res_1[i] + 0;
                }
                else r = res_1[i]+res_2[j];

                if(r < 10)   //按位计算加法后,若结果小于了10,则直接将该结果按数组下标赋值给结果数组
                {
                    res[i] = r + res[i];
                    //System.out.println(r);
                }
                else   //按位计算加法后,若结果大于了10,则将该结果的个位放在结果数组的的当前位,进位放在结果数组的下一位
                {
                    res[i] = r%10 + res[i];
                    res[i+1] = 1;
                }
            }
        }
        else   //若第二个数组更长或相等时, 则for循环的终止条件由第二个长度控制
        {
            for (int i = 0, j = 0; i < second.length; i++, j++)  
            {
                if(j >= first.length)  //当短的数组全部读完,长的数组没读完,则短取0参与计算
                {
                    r = res_2[i] + 0;
                }
                else r = res_2[i]+res_1[j];
                if(r < 10)  //按位计算加法后,若结果小于了10,则直接将该结果按数组下标赋值给结果数组
                {
                    res[i] = r + res[i];
                    //System.out.print(r);
                }
                else   //按位计算加法后,若结果大于了10,则将该结果的各个位放在结果数组的的当前位,进位放在结果数组的下一位
                {
                    res[i] = r%10 + res[i];
                    //System.out.println(r);
                    res[i+1] = 1;
                }
            }
        }
        return InvertedArrary_int(res);
    }
    //倒序整型数组
    private static int[] InvertedArrary_int(int[] arrary)
    {
        int[] changed = new int[arrary.length];
        for (int i = 0, j = arrary.length-1; i < arrary.length; i++,j--)
        {
            changed[i] = arrary[j];
        }
        return changed;
    }
    //倒序char数组元素
    private static char[] InvertedArrary(char[] arrary)
    {
        char[] changed = new char[arrary.length];
        for (int i = 0, j = arrary.length-1; i < arrary.length; i++,j--)
        {
            changed[i] = arrary[j];
        }
        return changed;
    }
    //打印结果数组
        private static void dis(int[] res)
        {
            for(int i = 0; i < res.length; i++)
            {
                if(res[i] == 0 && res.length > 2)
                    {
                        continue;
                    }
                else
                    System.out.print(res[i]);
            }
        }
    //char的数字转换为int数字
    private static int[] CharToInt(char[] a)
    {
        int[] b= new int[a.length];
        for (int i = 0; i < a.length; i++)
        {
            b[i] = (int)a[i] - '0';
            //System.out.print(); 
        }
        //System.out.println(b[0]);
        return b;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值