大整数乘法:概念上就是一个用int,long, long long ,double等存不了的数,长度为几百位
所以我们用字符串来存储并且从最小位开始存,然后大整数乘法也就转化成了
小学里的竖式乘法的问题。
例题:
链接:https://www.nowcoder.com/acm/contest/118/E
来源:牛客网
题目描述
Kirai聊天的时候非常喜欢发“233”,“233”来源于猫扑表情第233号,是一张捶地大笑的表情。
Kirai每当看到很好玩的消息的时候总会回一串“2333...”。
Kirai其实十分高冷,他发现了这个问题。为了不希望别人立刻知道他在笑,他决定将两个“233..”乘在一起发出去。
输入描述:
输入样例有多组,全部是正整数。首先输入样例组数T(T≤1500)。接下来输入T组数,每组数字由两个233串组成,每个233串长度3≤n≤50。数据保证每个233串必然会有一个2作为开头,并且3的数量≥2。
输出描述:
两个233串的乘积。
示例1
输入
2 233 233 23333333333333333333333333333333333333333333333333 23333333333333333333333333333333333333333333333333
输出
54289 544444444444444444444444444444444444444444444444428888888888888888888888888888888888888888888888889c++代码如下
#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大法好!
原文地址:https://www.cnblogs.com/buerdepepeqi/p/9015387.html
时间: 2024-09-30 14:28:32