大数相乘

大数相乘

题目:有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
例子:
输入 :72106547548473106236 982161082972751393
输出:70820244829634538040848656466105986748

前言

今天值得记录的小事:
(1) 第一次吃日料,39块一碗的豚骨面,有点贵,里面也没啥肉,不过味道不错!
(2) 和大学舍友去看了七龙珠,还不错。悟空真的是强的变态,性格还是和以前一样,沉稳中带着调皮。

思路

本题的思路其实很直接就是把两个数的乘法用代码模拟出来!思路简单,做起来还是很难的!!!

关于两个大数的乘法

主要方法:
(1)将每一位做乘法,然后对应相加。此时不考虑进位。用数组来存储这些值,记得第一个数从数组的第二个位置开始存,因为第一个位置要考虑到进位。
(2)单独考虑进位

完整的代码

import java.util.Scanner;

/*
 * 题目:大整数相乘
 * 用两个字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
 * */
public class mianshiti3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		String num1=scan.nextBigDecimal().toString();
		String num2=scan.nextBigDecimal().toString();
		StringBuffer sb=new StringBuffer();
		int len1=num1.length();
		int len2=num2.length();
		
		int [] arr1=new int [len1];
		int [] arr2=new int [len2];
		for(int i=0;i<len1;i++) {
			arr1[i]=Integer.parseInt(num1.charAt(i)+"");
		}
		for(int i=0;i<len2;i++) {
			arr2[i]=Integer.parseInt(num2.charAt(i)+"");
		}
		int [] arr3=new int [len1+len2];
		/*两个大数相乘的算法
		 * 			9  8
		 * 		*	2  1
		 * --------------
		 * 			9  8
		 * 		18  16
		 * ---------------
		 *      18  25 8
		 * 先不进位,最后一步进位
		*/
		for(int i=0;i<arr1.length;i++) {
			for(int j=0;j<arr2.length;j++) {
				arr3[i+j+1]=arr3[i+j+1]+arr1[i]*arr2[j];
			}
		}
		//单独表示进位
		for(int i=arr3.length-1;i>0;i--) {
			if(arr3[i]>=10) {
				arr3[i-1]=arr3[i-1]+arr3[i]/10;
				arr3[i]=arr3[i]%10;
			}
		}
		for(int i=0;i<arr3.length;i++) {
			if(i==0&&arr3[i]==0) {
				continue;
			}
			sb.append(arr3[i]);
		}
					
		
		System.out.print(sb);
		
	}

}

值得注意的知识点

(1)用Scanner读取大的整数的方法:scan.nextBigDecimal().toString();
(2)数组的第一个位置可能为0,要考虑进去,比如12*34,就可能输出0408,结果是不正确的!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值