算法笔记_097:蓝桥杯练习 算法提高 P1001(Java)
2017-03-19 15:40
531 查看
1 问题描述
当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.输入:
62773417 12345678
输出:
774980393241726
2 解决方案
此题考查使用字符串来计算具体整数的乘法运算,由于题目说明输入的均为数字,所以代码中不需要做出是否为数字的判断,但要防备一点,输出负数的情况。虽然,测试数据中没有负数情况,但是做题的时候还是要考虑到~具体代码如下:
import java.util.Scanner; public class Main { public void printResult(String A, String B) { char[] arrayA = A.toCharArray(); char[] arrayB = B.toCharArray(); int len = A.length() + B.length(); int judge = 1; //用于判定A*B最终结果正负,1代表为正,-1表示为负 int enda = 0, endb = 0; //用于指定A和B中最后一个数字的位置(从后往前遍历) if(arrayA[0] == '-' && arrayB[0] != '-') { judge = -1; len = len - 1; enda = 1; } else if(arrayA[0] != '-' && arrayB[0] == '-') { judge = -1; len = len - 1; endb = 1; } else if(arrayA[0] == '-' && arrayB[0] == '-') { len = len - 2; enda = 1; endb = 1; } int[] result = new int[len]; int a, b; for(int i = A.length() - 1, tempi = 0; i >= enda;i--,tempi++) { a = arrayA[i] - '0'; for(int j = B.length() - 1, tempj = 0;j >= endb;j--, tempj++) { b = arrayB[j] - '0'; result[len-tempi-tempj-2] += (result[len-tempi-tempj-1] + a * b) / 10; //进位操作 result[len-tempi-tempj-1] = (result[len-tempi-tempj-1] + a * b) % 10; //当前位的数 } } int i = 0; while(result[i] == 0 && i < len - 1) i++; //除去结果前面的所有多余0,此处使用len-1是因为,若结果全为0,输出最后一个0 if(judge == -1) System.out.print("-"); for(;i < len;i++) System.out.print(result[i]); } public static void main(String[] args) { Main test = new Main(); Scanner in = new Scanner(System.in); String A = in.next(); //注意,in.next表示遇到空格就不再读入 String B = in.next(); test.printResult(A, B); } }
相关文章推荐
- 算法笔记_096:蓝桥杯练习 算法提高 求最大值(Java)
- 算法笔记_081:蓝桥杯练习 算法提高 矩阵乘法(Java)
- 算法笔记_100:蓝桥杯练习 算法提高 三个整数的排序(Java)
- 算法笔记_102:蓝桥杯练习 算法提高 快乐司机(Java)
- 算法笔记_105:蓝桥杯练习 算法提高 上帝造题五分钟(Java)
- 算法笔记_099:蓝桥杯练习 算法提高 排列数(Java)
- 算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)
- 算法笔记_106:蓝桥杯练习 算法提高 周期字串(Java)
- 算法笔记_098:蓝桥杯练习 算法提高 盾神与条状项链(Java)
- 算法笔记_103:蓝桥杯练习 算法提高 金明的预算方案(Java)
- 算法笔记_101:蓝桥杯练习 算法提高 身份证号码升级(Java)
- 算法笔记_104:蓝桥杯练习 算法提高 新建Microsoft Word文档(Java)
- 算法笔记_062-蓝桥杯练习 最小乘积(基本型)(Java)
- 算法笔记_058:蓝桥杯练习 2的次幂表示(Java)
- 算法笔记_063:蓝桥杯练习 送分啦(Java)
- 算法笔记_059:蓝桥杯练习 Anagrams问题(Java)
- 算法笔记_062-蓝桥杯练习 最小乘积(基本型)(Java)
- 算法笔记_057-蓝桥杯练习 最大的算式 (Java)
- 算法笔记_062:蓝桥杯练习 最小乘积(基本型)(Java)
- 算法笔记_057-蓝桥杯练习 最大的算式 (Java)