高精度模板

目录

高精度加法

高精度减法

高精度乘法

高精度除法

高精除以单精

高精除以高精


高精度加法

#define MAX 100
int arr1[MAX], arr2[MAX];
string s;
void addition(int arr1[], int arr2[])
{
	int len1, len2;
	int t;
	cin >> s;  len1 = s.size();
	for (int i = 0; i < len1; i++) arr1[i] = s[s.size() - 1 - i] - '0';//字符串倒叙导入数组
	cin >> s;  len2 = s.size();
	for (int i = 0; i < len2; i++) arr2[i] = s[s.size() - 1 - i] - '0';
	//求长度len
	int len = (len1 > len2) ? len1 : len2;
	//加法运算
	for (int i = 0; i < len; i++) {
		arr1[i] += arr2[i];
		arr1[i + 1] += arr1[i] / 10;
		arr1[i] %= 10;
	}
	if (arr1[len] != 0) len++;//最后一位考虑是否进位
	//输出
	for (int i = 0; i < len; i++) cout << arr1[len - 1 - i];
}
//计算后len为数组长度,arr1[]为计算后得到的数组

高精度减法

#define MAX 100
int arr1[MAX], arr2[MAX];
string s1,s2;
int len;
int compare(string s1, string s2)//s1>=s2 返回0; s1<s2 返回1
{
	if (s1.size() > s2.size()) return 0;
	if (s1.size() < s2.size()) return 1;
	for (int i = 0; i <= s1.size(); i++) { if (s1[i] > s2[i]) return 0; if (s1[i] < s2[i]) return 1; }
	return 0;
}

void subtraction() {
	cin >> s1 >> s2;
	int len1 = s1.size(), len2 = s2.size();
	for (int i = 0; i < len1; i++) arr1[i] = s1[len1 - i - 1] - '0';//字符串倒序导入数组
	for (int i = 0; i < len2; i++) arr2[i] = s2[len2 - i - 1] - '0';
	if (compare(s1, s2) == 0) {//s1>=s2的情况
		len = len1;
		for (int i = 0; i < len1; i++) {//减法运算
			arr1[i] -= arr2[i];
			if (arr1[i] < 0) { arr1[i + 1]--; arr1[i] += 10; }
		}
		len++;
		while (arr1[len-1] == 0 && len > 1) len--;//去掉运算后数字前面的零
		//输出
		for (int i = len - 1; i >= 0; i--) cout << arr1[i];
	}
	else {//s1<s2的情况
		len = len2;
		for (int i = 0; i < len2; i++) {
			arr2[i] -= arr1[i];
			if (arr2[i] < 0) { arr2[i + 1]--; arr2[i] += 10; }
		}
		len++;
		while (arr2[len] == 0 && len > 1) len--;//去掉运算后数字前面的零
		//输出
		cout << "-";//注意此时要加负号
		for (int i = len - 1; i >= 0; i--) cout << arr2[i];
	}
}
//计算后len为数组长度,若s1>=s2,arr1[]为计算后得到的数组,若s1<s2,arr2[]为计算后得到的数组(此时要在数组前加上负号)

高精度乘法

#define MAX 100
int arr1[MAX], arr2[MAX], arr[MAX * 2];//注意数组长度
string s1,s2;
int len;
void multiplication() {
	cin >> s1 >> s2;
	int len1 = s1.size(), len2 = s2.size();
	for (int i = 0; i < len1; i++) arr1[len1 - i] = s1[i] - '0';
	for (int i = 0; i < len2; i++) arr2[len2 - i] = s2[i] - '0';
	for (int i = 1; i <= len1; i++) {
		int t = 0;											//存放进位
		for (int j = 1; j <= len2; j++) {
			arr[i + j - 1] = arr1[i] * arr2[j] + t + arr[i + j - 1];当前乘积+上次乘积进位+原数
			t = arr[i + j - 1] / 10;
			arr[i + j - 1] %= 10;
		}
		arr[i + len2] = t;									//进位
	}
	len = len1 + len2;
	while (arr[len] == 0 && len > 1) len--;//删除前导零
	for (int i = len; i >= 1; i--) cout << arr[i];
}
//计算后len为数组长度,arr[]为计算后得到的数组

高精度除法

高精除以单精

#define MAX 100
int a[MAX], arr[MAX];//数组a是除数,整数b是被除数
int b;
string s;
int len;
void division() {
	cin >> s;
	cin >> b;
	len = s.size();
	for (int i = 0; i < len; i++) a[i + 1] = s[i] - '0';//除法运算要正序放入
	int t = 0;
	for (int i = 1; i <= len; i++) {//按位相除
		arr[i] = (t * 10 + a[i]) / b;
		t = (t * 10 + a[i]) % b;
	}
	int len_start = 1;
	while (arr[len_start] == 0 && len_start < len) len_start++;//删除前导零
	for (int i = len_start; i <= len; i++) cout << arr[i];
}
//计算后len为数组长度,arr[]为计算后得到的数组

高精除以高精

//arr1为被除数,arr2为被除数,计算后arr为商,arr1为余数
//arr1[0]为arr1的长度,arr2[0]为arr2的长度,arr[0]为arr的长度,temp[0]为temp长度。
#define maxn 100
int arr1[maxn], arr2[maxn], arr[maxn], temp[maxn];
string s1, s2;
int compare(int a[], int b[])//比较a、b,若a>b为1;若a<b为-1;若a=b为0
{
    if (a[0] > b[0]) return 1;
    if (a[0] < b[0]) return -1;
    for (int i = a[0]; i > 0; i--)//从高位到低位比较
    {
        if (a[i] > b[i]) return 1;
        if (a[i] < b[i]) return -1;
    }
    return 0;
}

void subduction(int a[], int b[])//计算a=a-b
{
    if (compare(a, b) == 0)//相等
    {
        a[0] = 0;
        return;
    }
    if (compare(a, b) == 1)//大于
    {
        for (int i = 1; i <= a[0]; i++)
        {
            if (a[i] < b[i])//若不够向上借位
            {
                a[i + 1]--;
                a[i] += 10;
            }
            a[i] -= b[i];
        }
        while (a[0] > 0 && a[a[0]] == 0) a[0]--;//删除前导0
    }
}
void division() {
    cin >> s1 >> s2;
    arr1[0] = s1.size();
    arr2[0] = s2.size();
    for (int i = 1; i <= arr1[0]; i++)
        arr1[i] = s1[arr1[0] - i] - '0';
    for (int i = 1; i <= arr2[0]; i++)
        arr2[i] = s2[arr2[0] - i] - '0';
    arr[0] = arr1[0] - arr2[0] + 1;
    for (int i = arr[0]; i > 0; i--)
    {
        memset(temp, 0, sizeof(temp));
        for (int j = 1; j <= arr2[0]; j++)//从i开始的地方,复制数组b到数组temp
            temp[j + i - 1] = arr2[j];
        temp[0] = arr2[0] + i - 1;

        while (compare(arr1, temp) >= 0)//减法模拟
        {
            arr[i]++;
            subduction(arr1, temp);
        }
    }
    while (arr[0] > 0 && arr[arr[0]] == 0) arr[0]--;//删除前导0 
//输出
    cout << "商为:";
    if (arr[0] == 0) { arr[1] = 0; arr[0] = 1; }
    for (int i = arr[0]; i > 0; i--)  cout << arr[i]; cout << endl;
    cout << "余数为:";
    if (arr1[0] == 0) { arr1[1] = 0; arr1[0] = 1; }
    for (int i = arr1[0]; i > 0; i--)  cout << arr1[i]; cout << endl;
}
//计算后arr[]为商,arr1[]为余数,arr[0]为arr的长度,arr1[0]为arr1的长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值