高精度加减乘除

这四道题灰常简单(真是保姆级别注释)

高精度加

思路:

首先这么长的数字 long long 都装不下,所以只能用数组存,然后一位一位相加,最后倒序输出

废话不多说,下面直接放四道题的思路点拨以及AC代码

AC代码(加法):

#include<bits/stdc++.h>//万能头,懂得都懂
using namespace std;
string s1,s2;
int a[300],b[300],c[300];//定义数组
int main(){
    cin>>s1>>s2;
    int len1=s1.size();//记录字符串长度
    int len2=s2.size();
    for(int i=0;i<len1;i++){
        a[len1-i]=s1[i]-'0';//存入数组A
    }
    for(int i=0;i<len2;i++){
        b[len2-i]=s2[i]-'0';//存入数组B
    }
    int len=max(len1,len2)+1;//记录哪个数字长,因为加法最多进一位,所以在数位最多的数上再加一(即便没进位也没太大关系)
    for(int i=1;i<=len;i++){//单个数位进位计算
        c[i]+=a[i]+b[i];//c[i]记录单个数位总和
        c[i+1]+=c[i]/10;//防范单个数位进位,如果>=10再%10加在c[i+1]上面
        c[i]%=10;//再把十位%掉
    }
    while(c[len]==0 && len>1)len--;//去除前导零(由于是倒序,正序过来就是后导零)
    for(int i=len;i>=1;i--)cout<<c[i];//输出c数组(总和)
    return 0;
}//完美结束

高精度减

思路:

思路跟加法差不多,只是把进位改成退位,再加个特判

AC代码(减法):

#include<bits/stdc++.h>//万能头,懂得都懂
using namespace std;
int a[300],b[300],c[300];//定义数组
string s1,s2;
int main(){
	cin>>s1>>s2;
	if(s1.size()<s2.size() or s1.size()==s2.size() and s1<s2){//特判,本题没有负数,所以只能大数减小数
        swap(s1,s2);
        cout<<"-";
	}
	int len1=s1.size();//记录字符串长度
	int len2=s2.size();
	for(int i=0;i<len1;i++){
		a[len1-i]=s1[i]-'0';//存入数组A
	}
	for(int i=0;i<len2;i++){
		b[len2-i]=s2[i]-'0';//存入数组B
	}
	int len=max(len1,len2);//记录哪个数字长,减法不会进位,只会退位
	for(int i=1;i<=len;i++){//单个数位退位计算
		if(a[i]<b[i]){//这里判断退位情况
			a[i+1]--;//向上借位
            		a[i]+=10;//a[i]加10再减b[i]
		}
		c[i]+=a[i]-b[i];//不退位,直接减
	}
	while(c[len]==0 and len>1) len--;//去除前导零(由于是倒序,正序过来就是后导零)
	for(int i=len;i>=1;i--) cout<<c[i]; //输出c数组(差)
	return 0;
}//完美结束

高精度乘

思路:

其实高精度思路都差不多,乘法最恶心,因为处理进位不知道要进几位

#include<bits/stdc++.h>//万能头,懂得都懂
using namespace std;
const int N=500;
int a[N],b[N],c[N];//由于数据可能很大,所以开const
string s1,s2;
int main(){
	cin>>s1>>s2;
	int len1=s1.size(),len2=s2.size();//记录字符串长度
	for(int i=0;i<len1;i++){
		a[len1-i]=s1[i]-'0';//存入数组A
	}
	for(int i=0;i<len2;i++){
		b[len2-i]=s2[i]-'0';//存入数组B
	}
	int len=len1+len2;//相乘最多位数为两个乘数相加
	for(int i=1;i<=len1;i++){//单个数位计算
		for(int j=1;j<=len2;j++){//嵌套循环
			c[i+j-1]+=a[i]*b[i];//如果进位就依次往后加
			c[i+j]+=c[i+j-1]/10;//把十位去掉
			c[i+j-1]%=10;//保留各位
		}
	}
	while(c[len]==0 && len>1) len--;//去除前导零(由于是倒序,正序过来就是后导零)
	for(int i=len;i>=1;i--){
		cout<<c[i];//输出c数组(乘积)
	}
	return 0;
}//完美结束

高精度除

思路:

前面三道都是中等,虽然这道是困难,但代码都挺简单的(只是理解比较难)

#include <bits/stdc++.h>//万能头,懂得都懂
using namespace std;
string s1;
int a[300],b,c[300]; //定义数组,b是单精度
int main(){
	cin>>s1>>b;
    int len1=s1.size();
	for(int i=0;i<s1.size();i++){
		a[i+1]=s1[i]-'0';//记录字符串长度
	}
	int len=len1;//len1赋值给len
	int x=0;//定义x记录数值
	for(int i=1;i<=len;i++){//单个数位计算
		x=(x*10+a[i]);//
		c[i]=x/b;
		x=x%b;//%b求余
	}
	int t=1;
	while(c[t]==0 && t<len) t++;
	for(int i=t;i<=len;i++){
		cout<<c[i]; //输出c数组(商)
	}
    return 0;
}//完美结束


留个关注:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值