算法提高 P1001

  当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.

输入:
  62773417  12345678

输出:
  774980393241726



//因为一个a位数乘一个b位数只能得到一个(a+b)或(a+b-1)位数;或者有乘数为0,则结果为0
import java.util.*;
public class Main
{
	public static void main(String args[]){
	Scanner sc=new Scanner(System.in);
	String s1=sc.next();
	String s2=sc.next();
	int len1=s1.length();
	int len2=s2.length();
	int p=len1+len2;
	int k[]=new int[p];//存每个位数上的数值(eg.k[6]=8表示10^6数位上的值为8,也就是8*10^6)
	int m=0;
	for(int i=0;i<len1;i++){//将各数位上的数相乘,结果存到数组中对应的位数上
		for(int j=0;j<len2;j++){
		m=i+j;
		k[m]+=(int)(s1.charAt(len1-1-i)-48)*(int)(s2.charAt(len2-1-j)-48);
		}
	}
	for(int i=0;i<k.length;i++){//将>=10的数进位
		if(k[i]>=10){
			k[i+1]+=k[i]/10;
			k[i]%=10;
		}
	}
	if(k[p-1]==0&&k[p-2]==0)//如果前两位都为0,证明乘数中至少一个为0,因此输出结果为0
		System.out.println(0);
	else{
	if(k[p-1]!=0)//如果第一位不为0,输出;为0,跳过(不输出)
		System.out.print(k[p-1]);
	for(int i=p-2;i>=0;i--){//剩下位数依次输出
		System.out.print(k[i]);
	}
	}
	sc.close();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值