【Java】算法积累1——大整数相加

算法刚刚入门,每次记录下自己所学的知识总结以及理解,希望能够帮助大家,如有内容有错误或可改进的地方,欢迎一起探讨,一起进步,在此也要感谢WYSCODER学长给我的学习建议

目录

方法一:

思路:

代码:

方法二:

代码:


大整数:超过了long类型,已经不能直接相加了,会造成数据溢出

方法一:

就像我们小学学的加法,按位相加,那我们用代码怎么实现呢

思路:

/*
        思路:
            先开两个整型数组,其长度为两个大数的位数最大的那个+1,分别存两个大数(倒序存入),为了方便在遍历结果数组中进行两个大数的从后往前相加

            再开一个整型数组,用来存放两个大数相加的和,其长度也是两个大数的位数最大的那个+1,
            原因:
                进位+1,例如:12+99,那我们就应该开一个三位的整型数组来存放

            为什么关于两个大数开的数组长度也为位数最大+1?
            原因:
                因为后面在遍历结果数组中,要将两个大数的每一位进行相加,如果不统一数组长度,会造成数组越界

            遍历结果数组,将大数a与大数b对应索引值的值进行相加,开一个变量temp进行保存,并判断temp是否>=10,如果满足则要进行进位,那下一位的temp值保存为1,本位则要-10
     */

代码:

//努力学习Java
package 大整数相加问题;

import java.io.*;
import java.util.Scanner;

public class 大整数相加基础 {
    static StreamTokenizer input = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static PrintWriter output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    static Scanner scanner = new Scanner(System.in);

    public static StringBuilder getBigNumSum(String bigNum1,String bigNum2){
        int max_length = Math.max(bigNum1.length(), bigNum2.length());
        /*
            找最大长度两种方法:
                            1.利用三目运算符
                                    int max_length = bigNum1.length()>bigNum2.length()?bigNum1.length():bigNum2.length();
                            2.利用Math工具类
                                    int max_length = Math.max(bigNum1.length(),bigNum2.length());

         */
        /*
            将两个大数分别存放到数组中
         */
        int[] arr1 = new int[max_length+1];
        for (int i = 0; i < bigNum1.length(); i++) {
            arr1[i] = bigNum1.charAt(bigNum1.length()-1-i)-'0';
            /*
                想一下:为什么会有-‘0’这步操作
                因为我们取的bigNum1.charAt(bigNum1.length()-1-i))其实是ASCII值
                例如:num = 123313213
                我们要想取第二位2
                如果只写num.charAt(1),那么得到的结果并非2,而是它对应的ASCII值,也就是50,
                那么我们要想结果为2,就要减去0的ASCII的值,(ASCII是对应着十进制的数字,因此是连续着的)那么我们就知道0对应的ASCII值就是48,因此十进制下的2-0,就等于‘2‘-’0’,
                结果就是我们想要的了,这样的思想在进制转换也会涉及到
             */
        }
        int[] arr2 = new int[max_length+1];
        for (int i = 0; i < bigNum2.length(); i++) {
            arr2[i] = bigNum2.charAt(bigNum2.length()-1-i)-'0';
        }
        int[] res_arr = new int[max_length+1];
        for (int i = 0; i < res_arr.length; i++) {
            int temp = res_arr[i];
            temp += arr1[i];
            temp += arr2[i];
            /*
                判断是否>=10,大于10,本位-10,下位的先保存1
             */
            if (temp>=10){
                temp -= 10;
                res_arr[i+1] = 1;
            }
            res_arr[i] = temp;
        }
        /*
            创建StringBuilder类的对象res,如果返回值类型为String,则要进行转换
            res.toString();
            也可以使用String创建
         */
        StringBuilder res = new StringBuilder();
        boolean f = false;
        for (int i = res_arr.length-1; i >= 0; i--) {
            if (!f){
                if (res_arr[i]==0){
                    continue;
                }
                f = true;
            }
            res.append(res_arr[i]);
        }
        return res;
    }
    public static void main(String[] args) {
        int t = scanner.nextInt();
        while (t-->0){
            String bigNum1 = scanner.next();
            String bigNum2 = scanner.next();
            output.println(getBigNumSum(bigNum1,bigNum2));
            output.flush();
        }
        output.close();
    }
}

方法二:

Java的工具类非常的强大,我们可以直接使用BigInteger工具类进行大数相加运算

代码:

//努力学习Java
package 大整数相加问题;

import java.io.*;
import java.math.BigInteger;
import java.util.Scanner;

public class 利用大数工具类 {
    static StreamTokenizer input = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static PrintWriter output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        int t = scanner.nextInt();
        while (t-->0) {
            String a = scanner.next();
            String b = scanner.next();
            BigInteger bigNum1 = new BigInteger(a);
            BigInteger bigNum2 = new BigInteger(a);
            output.println(bigNum1.add(bigNum2));
            output.flush();
        }
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪心算法是一种问题求解方法,它在每一步总是做出当前情况下的最优选择,以期望获得最优解。而"最大整数"同样可以使用贪心算法来求解。 对于"最大整数"的问题,我们可以考虑如下的贪心策略:从高位开始,尽可能选择较大的数字。具体步骤如下: 1. 对于给定的整数,我们首先将其转化为一个数组,其中每个元素表示整数的一个位数。 2. 从最高位(最左侧)开始,遍历数组。 3. 对于当前位上的数字,从9开始递减,找到第一个小于等于当前数字的最大数字。 4. 如果找到了符合条件的最大数字,将其放在当前位。否则,不做任何操作。 5. 继续向下遍历,重复步骤3-4。 6. 最终,得到的数组即为满足条件的最大整数。 以一个具体的例子说明上述算法:假设给定的整数为5372。 1. 将整数转化为数组[5, 3, 7, 2]。 2. 从最高位开始遍历。 3. 对于第一位5,从9开始递减,找到第一个小于等于5的数字,为7。 4. 将7放在第一位,得到[7, 3, 7, 2]。 5. 对于第二位3,从9开始递减,找到第一个小于等于3的数字,为3(与当前数字相等)。 6. 不做任何操作,得到[7, 3, 7, 2]。 7. 对于第三位7,从9开始递减,找到第一个小于等于7的数字,为7。 8. 将7放在第三位,得到[7, 3, 7, 2]。 9. 对于第四位2,从9开始递减,找到第一个小于等于2的数字,为2。 10. 将2放在第四位,得到[7, 3, 7, 2]。 11. 遍历结束,最终得到的数组为[7, 3, 7, 2],转化为整数为7372。 通过上述贪心算法,我们得到了满足条件的最大整数7372。证明了贪心算法在"最大整数"问题中的有效性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值