高精度加,减,乘,除代码模板

一.首先是高精度加法但是用数组来存储结果

#include<bits/stdc++.h>
using namespace std;

string a, b;
int c[100000];

int main()	//高精度加法 
{
	//用数组来存储结果的方法 
    cin >> a >> b;
    int len1 = a.length();
    int len2 = b.length();
    //反转字符串使其从低位到高位排列 
    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());
    if (len1 < len2)	//多加一位为最高位的前进位 
    {
        for (int i = 0;i <= len2 - len1;i++)
            a = a + '0';
        b = b + '0';
    }
    else if (len1 > len2)
    {
        for (int i = 0;i <= len1 - len2;i++)
            b = b + '0';
        a = a + '0';
    }
    else
    {
        a = a + '0';
        b = b + '0';
    }
    int l = max(len1, len2);
    int w = 0;
    for (int i = 0;i <= l;i++)
    {
        int now = (a[i] - '0') + (b[i] - '0') + w;
        c[i] = now % 10;
        w = now / 10;
    }
    if (c[l] == 0)		//判断其最后的长度 
        l = l - 1;
    for (int i = l;i >= 0;i--)
    {
        cout << c[i];
    }
}

二.高精度加法在c++字符串上运算

#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
using namespace std;


int main()	//高精度加法 
{
	//直接在字符串上计算的方法 ,结果为字符串 
    string a, b, res;
    cin >> a >> b;
    int len1 = a.length();
    int len2 = b.length();
    if (len1 < len2)	//前补零,最高位可能进位的那位不补 
    {
        for (int i = 0;i < len2 - len1;i++)
        {
            a = "0" + a;
        }
        len1 = len2;
    }
    else if (len1 > len2)
    {
        for (int i = 0;i < len1 - len2;i++)
        {
            b = "0" + b;
        }
        len2 = len1;
    }
    int now,jw=0;	//当前位结果,以及进位 
    for(int i=len1-1;i>=0;i--)
    {
        now=a[i]-'0'+b[i]-'0'+jw;
        jw=now/10;
        res=char(now%10+'0') + res;
    }
    if(jw==1)	//判断最高位是否要进位 
        res='1'+res;
    cout<<res<<endl;
}

三.高精度减法(负数可以转化为整数运算

eg.正数-负数=两个正数相加

#include<iostream>
#include<algorithm>
using namespace std;

string a, b;
int c[100000];

int main()	//高精度减法 
{
	cin >> a >> b;
	bool fs = 0;	//判断结果是否为负数 
	int len1 = a.length();
	int len2 = b.length();
	//确保大数一定在前面,此模板只能两个大于零的数相减 
	//若两个数中含有负数,可转化其形式确保运算时,两数不是负数 
	if (len1 < len2)	
	{
		swap(a, b);
		fs = 1;
		len1 = len1 + len2;
		len2 = len1 - len2;
		len1 = len1 - len2;
	}
	if (len1 == len2 && b > a)
	{
		swap(a, b);
		fs = 1;
	}
	for (int i = 0;i < len1 - len2;i++)		//小的那个数前补0 
	{
		b = '0' + b;
	}
	int now;
	for (int i = len1 - 1;i >= 0;i--)	//从低位到高位减
	{
		now = a[i] - '0' - (b[i] - '0');
		if (now < 0)
		{
			now = now + 10;
			a[i - 1] = a[i - 1] - 1;
		}
		c[len1 - 1 - i] = now;
	}
	//删除前导零 
	while (c[len1 - 1] == 0 && len1 > 1)	len1--;	
	if (fs == 1)
		cout << "-";
	for (int i = len1 - 1;i >= 0;i--)
	{
		cout << c[i];
	}
}

四.高精度乘法(有技巧

每个位和每个位相乘(而不是两数相乘,或者每一位乘以某个数)

对应位相乘(例如i和j)后的结果位置为i+j-1

#include<bits/stdc++.h>
using namespace std;

string a,b;
int res[100005];

int main()		//高精度乘法 
{
	cin>>a>>b;
	if(a=="0"||b=="0")
	{
		cout<<"0";
		return 0;
	 } 
	int al=a.length();
	int bl=b.length();
	reverse(a.begin(),a.end());		//反转一下从小位到大位排列 
	reverse(b.begin(),b.end());
	//每一位单独相乘 如果从1位开始3*2位结果因该在第4位,i+j-1
	//但是如果从第0位开始的话,第2位乘以第2为结果为第三位,i=1,j=1,结果应该为i+j 
	for(int i=0;i<al;i++)	
		for(int j=0;j<bl;j++)	
		{
			res[i+j]=res[i+j]+(a[i]-'0')*(b[j]-'0');
		}
	
	int w=0;	//进位 
	for(int i=0;i<al+bl;i++)
	{
		res[i]=res[i]+w;	//计算当前位的值 
		w=res[i]/10;		//计算当前进位 
		res[i]=res[i]%10;	//对10取余 
	}
	//若从1开始,应判断i+j,否则判断i+j-1 
	int l;
	if(res[al+bl-1]!=0)		//结果长度判断 
		l=al+bl;
	else
		l=al+bl-1;
	for(int i=l-1;i>=0;i--)		//输出 
	{
		cout<<res[i];
	}
}

五.高精度除法(模拟竖列式除法

数列式怎么算,就怎样模拟

#include<bits/stdc++.h>
using namespace std;

int a[5001];
int quotient[5001];
int main()
{
	//思想,模拟数列式除法 
	string s;
	int b;
	cin >> s >> b;
	reverse(s.begin(),s.end());		//反转 
	for (int i = 0;i < s.size();i++)	//转为整数存入到数组中 
		a[i + 1] = s[i] - '0';
	long long tmp = 0;		//当前要除除数的值 
	for (int i = s.size();i >= 1;i--)	//从高位到低位计算 
	{
		tmp *= 10;
		tmp += a[i];
		quotient[i] = tmp / b;
		tmp %= b;
	}
	int i = 5000;
	for (;(i >= 2) && (quotient[i] == 0);i--);
	for (;i >= 1;i--)	//商 
		cout << quotient[i];
	cout<<endl<<tmp; 	//余数,最后除不了剩下的数 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值