解题思路:和1475题一样,1475题目链接:https://www.dotcpp.com/oj/problem1475.html
由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
定义一个数组nums1,nums1[0]用于存储a的个位,nums1[1]用于存储a的十位,依此类推。同样可以用一个数组nums2来存储b。
计算a + b的时候,首先将nums1[0]与nums2[0]相加,如果有进位产生,则把进位(即和的十位数)用一个进位变量oldJ存起来,把和的个位数存入nums1[0],即nums1[0]等于(nums1[0]+nums2[0])%10。然后计算nums1[1]与nums2[1]相加,这时还应将低位进上来的值oldJ也加起来,即nums1[1]应该是nums1[1]、nums2[1]和oldJ三个数的和.
使用两个进位,可以避免在计算nums[i]之前计算好进位,就不能在这一轮使用进位了,如果在计算nums[i]后计算进位,因为nums[i]的值发生改变,所以进位的值也被改变的问题。
参考代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { int[] nums1 = new int[10000]; int[] nums2 = new int[10000]; Scanner scanner = new Scanner(System.in); // 输入处理第一个数 String inputs = scanner.next(); char[] input1 = inputs.toCharArray(); for (int i = 0; i < input1.length; i++) { nums1[i] = input1[input1.length - 1 - i] - '0'; } // 输入处理第二个数 inputs = scanner.next(); char[] input2 = inputs.toCharArray(); for (int i = 0; i < input2.length; i++) { nums2[i] = input2[input2.length - 1 - i] - '0'; } // 如果两个数都是0,输出0; if(input1[0]=='0'&&input2[0]=='0') { System.out.println("0"); return; } int maxLength = input1.length>input2.length?input1.length:input2.length; int oldJ = 0; // 旧的进位 int newJ = 0; // 新的进位 for (int i = 0; i <= maxLength; i++) { newJ = (oldJ + nums1[i] + nums2[i]) / 10; nums1[i] = (oldJ + nums1[i] + nums2[i]) % 10; oldJ = newJ; } boolean b = true; // 当遇见第一个非0的数的时候,关闭开关,后面的数直接打印 for (int i = nums1.length - 1; i >= 0; i--) { if (nums1[i] == 0 && b) { continue; } b = false; System.out.print(nums1[i]); } } }
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复