高精度加法、乘法

1. 高精度加法

  • 处理:数据的接收和存储进位问题

  • 要领:模拟加法运算式(如下图)

2025-11-19_165638

#include<bits/stdc++.h>
using namespace std;
int a[1010],b[1010],c[1010]; //分别存加数、被加数、结果 
int main()
{
	char sa[1010],sb[1010];//用字符串输入 
	cin>>sa>>sb;
	int la=strlen(sa),lb=strlen(sb);
	for(int i=1;i<=la;i++){
		a[i]=sa[la-i]-'0'; //字符串逆序转成整型  由高到低位——>由低到高位 
	}
	for(int i=1;i<=lb;i++){
		b[i]=sb[lb-i]-'0';
	}
	int lc=max(la,lb)+1; //加一位避免遗漏最高位的进位 
	int m=0; //进位  加法的进位只能是0和1 
	for(int i=1;i<=lc;i++){
		c[i]=a[i]+b[i]+m;
		if((c[i])>9){
			c[i]=c[i]-10;
			m=1;  //进位 
		} 
		else{
			m=0; //不进位 
		} 
	}
	for(int i=lc;i>=1;i--){ //由高到低位输出 
		if(c[i]==0 && i==lc) continue;
		cout<<c[i];
	}
	
	return 0;
 }

2. 高精度乘法

  • 模拟竖式乘法运算式

  • 用一个数的每一位a[i](从低位开始)逐位与另一个数的每一位b[j]相乘

2025-11-19_172935

#include<bits/stdc++.h>
using namespace std;
int a[110],b[110],c[210];
int main()
{
	char sa[110],sb[110];
	cin>>sa>>sb;
	int la=strlen(sa),lb=strlen(sb);
	for(int i=1;i<=la;i++){
		a[i]=sa[la-i]-'0';
	}
	for(int i=1;i<=lb;i++){
		b[i]=sb[lb-i]-'0';
	}  //以上为字符到整型的转换 
	
	int k,w,x,y;
	for(int i=1;i<=la;i++){
		for(int j=1;j<=lb;j++){ //a[i]的每一个数依次与b[j]的每个数相乘 
			w=a[i]*b[j];
			x=w%10;  //当前位 
			y=w/10;  //进位 
			k=i+j-1; //所在位数 
			c[k]=c[k]+x;
			c[k+1]=c[k+1]+y+c[k]/10;  
			c[k]=c[k]%10;
		}
	}
	int lc=la+lb;
	while(c[lc]==0){  //找到最高的非0位 
		lc--;  
		if(lc<0) {  //特殊情况:只有一位0 
			cout<<0;
			return 0; 
		}
	} 
	for(int i=lc;i>=1;i--){
		cout<<c[i];
	}
	return 0;
 }
posted @ 2025-11-19 17:30  TFLXXCY  阅读(3)  评论(0)    收藏  举报