标签:链接 while ati 正整数 int stream des 一个 ble
大整数乘法:概念上就是一个用int,long, long long ,double等存不了的数,长度为几百位
所以我们用字符串来存储并且从最小位开始存,然后大整数乘法也就转化成了
小学里的竖式乘法的问题。
例题:
链接:https://www.nowcoder.com/acm/contest/118/E
来源:牛客网
输入样例有多组,全部是正整数。首先输入样例组数T(T≤1500)。
接下来输入T组数,每组数字由两个233串组成,每个233串长度3≤n≤50。
数据保证每个233串必然会有一个2作为开头,并且3的数量≥2。
两个233串的乘积。
2 233 233 23333333333333333333333333333333333333333333333333 23333333333333333333333333333333333333333333333333
54289 544444444444444444444444444444444444444444444444428888888888888888888888888888888888888888888888889
c++代码如下
#include<cstdio> #include<iostream> #include<string.h> #include<algorithm> using namespace std; char a[100],b[100]; int c[100],d[100]; void Bigintercheng(){ memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); int lena=strlen(a); int lenb=strlen(b); for(int i=0;i<lena;i++){ c[i]=a[lena-i-1]-‘0‘; } for(int j=lenb-1;j>=0;j--){ for(int i=0;i<lena;i++){ d[i+lenb-1-j]+=c[i]*(b[j]-‘0‘); } } for(int i =0;i<lena+lenb-1;i++){ d[i+1]+=d[i]/10; d[i]%=10; } int f=0; for(int i=500;i>=0;i--){ if(!d[i]&&!f) continue; f=1; printf("%d",d[i]); } printf("\n"); } int main() { int t; scanf("%d",&t); while(t--){ cin>>a>>b; Bigintercheng(); } }
java代码如下
因为java有大整数的包,所以直接求解就行(java大法好
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { int t; Scanner in = new Scanner(System.in); t=in.nextInt(); for(int i=0;i<t;++i) { BigInteger a=in.nextBigInteger(); BigInteger b=in.nextBigInteger(); System.out.println(a.multiply(b)); } in.close(); } }
python代码如下(人生苦短,我用python
t = int(raw_input()) while t > 0: t-=1 a, b = raw_input().split() print(int(a)*int(b))
python大法好!
标签:链接 while ati 正整数 int stream des 一个 ble
原文地址:https://www.cnblogs.com/buerdepepeqi/p/9015387.html