今天是重学算法时第一次自己完全独立写出了高精乘!!

在这里插入图片描述

由上方这张图我们可以知道当我有A,B两个字符数组时,答案数组C[i+j]存储a[i]*b[j]的答案值,过程中我们还要记得保存进位的保存(乘完之后不要忘记进位.如果不为0的话要保存在c[i+j+1]中)

具体细节,为了方便两个数组我们提前倒转,C数组最后记得要倒项输出

完成之后不要忘记负数的情况,加一个flag记录一下

下面代码结合了牛客网的题目:牛客网NC15765

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
	int x=0,w=1;char ch=getchar();
	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return x*w;
}
#define maxn 1000000
char a[100],b[100],aa[100],bb[100];
int c[20000];
int main() {
	int T;cin>>T;
	while(T--) {
	//习惯性清空
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		memset(aa,0,sizeof(aa));
		memset(bb,0,sizeof(bb));
		int flag1=1,flag2=1;//记录正负号
		cin>>a>>b;
		int lena=strlen(a),lenb=strlen(b);
		if(a[0]=='-') {
			flag1=-1;
			for(int i=0;i<lena-1;i++) aa[i]=a[lena-i-1];
			lena-=1;
		}
		else for(int i=0;i<lena;i++) aa[i]=a[lena-i-1];
		if(b[0]=='-') {
			for(int j=0;j<lenb-1;j++) bb[j]=b[lenb-j-1];
			flag2=-1;
			lena-=1;
		}
		else {
			for(int i=0;i<lenb;i++) bb[i]=b[lenb-i-1];
		}
		//保障相乘式子上面的字符串的长度最长
		if(lena<lenb) {
			swap(lena,lenb);
			swap(aa,bb);
		}
//		cout<<aa<<" "<<bb<<endl;
//		cout<<a<<" "<<b<<endl;
		int cj,jw; 
		for(int i=0;i<lenb;i++) {
			for(int j=0;j<lena;j++) {
			//加上进位
				c[i+j]+=((aa[j]-'0')*(bb[i]-'0')+jw);
//				cout<<aa[j]-'0'<<" "<<bb[i]-'0'<<" "<<c[i+j]<<endl;  
				jw=c[i+j]/10;
				c[i+j]%=10;
				//如果乘完之后还有进位,就是最高位的值
				if(j==lena-1&&jw!=0) {
					c[i+j+1]=jw;
					jw=0;	
				}
			}
		}
		//为了方便,直接先取乘积长度最长的情况,等会去除前导0即可
		int lenc=lena+lenb;
		if(flag1*flag2<0) cout<<"-";
		int gg=0;
		for(int i=lenc-1;i>=0;i--) {
			if(c[i]==0&&gg==0)  {
				gg=1;
				continue;
			}
			cout<<c[i];
		}
		cout<<endl;
	}
	return 0;
}
/*
1
123 26
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值