一.高乘简介
其实和往期的高加http://t.csdn.cn/rXzsz 没什么区别,就是注意一下乘法的运算规律,多观察观察,实在不行就背住规律。总之记住会用就行。
二.乘法模拟,梦回小学
(照片来源于b站up主BV1LA411v7mt)
多看看,多演算,公式是重点!c[i+j-1]+=a[i]*b[j];
三.代码
1.核心代码
for(int i=1;i<=lena;i++){
for(int j=1;j<=lenb;j++){
c[i+j-1]+=a[i]*b[j]; //最核心的代码,实在不行就背住,本来也就是找规律找出来的
c[i+j]+=c[i+j-1]/10; //处理进位
c[i+j-1]%=10;
}
}
2.函数
void multiplication(char a1[],char b1[]){
int a[1001]={}; //乘数
int b[1001]={}; //被乘数
int c[1001]={}; // 积
int lena=strlen(a1),lenb=strlen(b1); //长度
int lenc=lena+lenb; //积的预测长度,大了没关系,之后会处理首位0
//基本操作,转char为int
for(int i=0;i<lena;i++){
a[lena-i]=a1[i]-'0';
}
for(int i=0;i<lenb;i++){
b[lenb-i]=b1[i]-'0';
}
//核心代码,进行高乘
for(int i=1;i<=lena;i++){
for(int j=1;j<=lenb;j++){
c[i+j-1]+=a[i]*b[j]; //最核心的代码,实在不行就背住,本来也就是找规律找出来的
c[i+j]+=c[i+j-1]/10; //处理进位
c[i+j-1]%=10;
}
}
//处理首位的0
while(lenc>0){
if(c[lenc]==0) lenc--;
else break;
}
//输出
for(int i=lenc;i>=1;i--){
cout<<c[i];
}
}
3.题目
题目描述:
给定一个高精度数a和b,输出它们的积
样例一:
输入:114514
2333333333
输出:267199333295162
样例二
输入:9999999999999
888888888
输出:8888888879999111111112
4.答案
#include<iostream>
#include<cstring>
using namespace std;
void multiplication(char a1[],char b1[]){
int a[1001]={}; //乘数
int b[1001]={}; //被乘数
int c[1001]={}; // 积
int lena=strlen(a1),lenb=strlen(b1); //长度
int lenc=lena+lenb; //积的预测长度,大了没关系,之后会处理首位0
//基本操作,转char为int
for(int i=0;i<lena;i++){
a[lena-i]=a1[i]-'0';
}
for(int i=0;i<lenb;i++){
b[lenb-i]=b1[i]-'0';
}
//核心代码,进行高乘
for(int i=1;i<=lena;i++){
for(int j=1;j<=lenb;j++){
c[i+j-1]+=a[i]*b[j]; //最核心的代码,实在不行就背住,本来也就是找规律找出来的
c[i+j]+=c[i+j-1]/10; //处理进位
c[i+j-1]%=10;
}
}
//处理首位的0
while(lenc>0){
if(c[lenc]==0) lenc--;
else break;
}
//输出
for(int i=lenc;i>=1;i--){
cout<<c[i];
}
}
int main(){
char a[1001]={},b[1001]={};
cin>>a>>b;
multiplication(a,b);
return 0;
}