2024.7.27学习笔记

目录

高精度

一、加法

二、减法

三、乘法

四、除法

1.高/低

2.高/高


高精度

一、加法

/*高精度加法*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
string s1,s2;
int a[MAX],b[MAX],c[MAX]; 
int _s1,_s2,_s;
void _JF(int a[],int b[],int c[]){
	for(int i=0;i<_s;i++){
		c[i]+=a[i]+b[i];//逐位相加 
		c[i+1]=c[i]/10;	//大于等于10的数向前进1位 
		c[i]%=10;//对10取模使得每一位都小于10 
	}
	if(c[_s]) _s++;//处理_s下标是否为0,不为0将长度+1 
}
void _solve(){
	cin>>s1>>s2;
	_s1=s1.size();
    _s2=s2.size();
	for(int i=0;i<_s1;i++){
		a[_s1-i-1]=s1[i]-'0';//字符转换为数字 
	} 
	for(int i=0;i<_s2;i++){
		b[_s2-i-1]=s2[i]-'0';
	}
	_s=max(_s1,_s2);
	_JF(a,b,c);
	for(int i=_s-1;i>=0;i--){
		cout<<c[i];
	}
} 
int main(){
	int T=1;
	//cin>>T;
	while(T--){
		_solve();
	}
	return 0;
}

二、减法

/*高精度减法*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
string s1,s2;
int a[MAX],b[MAX],c[MAX];  
void _solve(){
	cin>>s1>>s2;
	char flag='+';
	if(s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2)){
		swap(s1,s2);//交换s1,s2的值,使得s1一直是大的数 
		flag='-';
	}
	for(int i=0;i<s1.size();i++){
		a[s1.size()-i-1]=s1[i]-'0';
	}
	for(int i=0;i<s2.size();i++){
		b[s2.size()-i-1]=s2[i]-'0';
	}
	for(int i=0;i<s1.size();i++){
		if(a[i]<b[i]){
			a[i]=a[i]+10;//不够借10 
			a[i+1]=a[i+1]-1;//后一位借10,则前一位-1 
		}
		c[i]=a[i]-b[i];//逐位相减 
	}
	if(flag=='-'){
		cout<<flag;
	}
	int idex=0;
	for(int i=s1.size()-1;i>=0;i--){
		if(c[i]!=0){
			idex=i;//记录结果不为0的下标 
			break;
		}
	}
	for(int i=idex;i>=0;i--){
		cout<<c[i];
	}
} 
int main(){
	int T=1;
	//cin>>T;
	while(T--){
		_solve();
	}
	return 0;
}

三、乘法

/*高精度乘法*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
string s1,s2;
int _s,_s1,_s2;
int a[MAX],b[MAX],c[MAX+MAX]; 
void _Che(int a[],int b[],int c[]){
	for(int i=0;i<_s1;i++){
		for(int j=0;j<_s2;j++){
			c[i+j]+=a[i]*b[j];
			c[i+j+1]+=c[i+j]/10;//大于等于10则进位 
			c[i+j]%=10; 
		}
	}
	while(_s&&c[_s]==0) _s--; 
} 
void _solve(){
	cin>>s1>>s2;
	_s1=s1.size();
	_s2=s2.size();
	_s=_s1+_s2;
	for(int i=0;i<_s1;i++){
		a[_s1-i-1]=s1[i]-'0';
	} 
	for(int i=0;i<_s2;i++){
		b[_s2-i-1]=s2[i]-'0';
	}
	_Che(a,b,c);
	for(int i=_s;i>=0;i--){
		cout<<c[i];
	}
} 
int main(){
	int T=1;
	//cin>>T;
	while(T--){
		_solve();
	}
	return 0;
}

四、除法

1.高/低

/*高精度除法*/
// 高精度/低精度 
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
typedef long long ll;
string s;
ll a,b[MAX],c[MAX],_s; 
void D_Chu(int a,int b[],int c[]){
	ll x=0;
	for(int i=_s-1;i>=0;i--){
		x=x*10+b[i];
		c[_s-i-1]=x/a;
		x=x%a;//取余 
	}
	reverse(c,c+_s); //翻转 
	while(_s&&c[_s]==0) _s--;//处理多余的0 
}
void _solve(){
	cin>>s>>a;
	_s=s.size();
	for(int i=_s-1;i>=0;i--) b[_s-i-1]=s[i]-'0';
	D_Chu(a,b,c);
	for(int i=_s;i>=0;i--){
		cout<<c[i];
	} 
} 
int main(){
	int T=1;
	//cin>>T;
	while(T--){
		_solve();
	}
	return 0;
}

2.高/高

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值