大整数的加减乘除运算

大整数乘法(不考虑负数)

#include<iostream>
#include<string>
using namespace std;
int main()
{
    char str1[100];
    cin >> str1;
    char str2[100];
    cin >> str2;
    int a[100] = { 0 }, b[100] = { 0 }, result[10000] = { 0 };
    int len_a, len_b, len_r;
    len_a = strlen(str1);
    len_b = strlen(str2);
    //将字符串逆序存储
    for (int i = 0; i < len_a; i++)
    {
	a[len_a - i - 1] = a[i] - '0';
    }
    for (int i = 0; i < len_b; i++)
    {
        b[len_b - i - 1] = b[i] - '0';
    }
    //计算,将结果存于c中
    for (int i = 0; i < len_b; i++)
    {
        for (int j = 0; j < len_a; j++)
        {
	    result[i + j] += a[j] * a[i];
	    result[i + j + 1] += result[i + j] / 10;		//处理进位
	    result[i + j] %= 10;
        }
    }
    len_r = len_a + len_b;
    //删除结果集中高位的前缀0 
    while (result[len_r - 1] == 0 && len_r > 1)
    {
	len_r--;
    }
    //将结果逆序输出
    for (int i = len_r - 1; i >= 0; i--)
    {
	cout << result[i];
    }
    cout << endl;
    return 0;
}

 大整数加法

#include <iostream>
using namespace std;
#define MAXD 100
int main()
{
    char str1[MAXD], str2[MAXD]; 
    int a[MAXD], b[MAXD];
    memset(str1, 0, sizeof(str1));
    memset(str1, 0, sizeof(str2));
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));//将这些数组清零
    cin >> str1;
    cin >> str2;
    int len1, len2, i, j;
    len1 = strlen(str1);
    len2 = strlen(str2);
    j = 0;
    int max = len1>len2 ? len1 : len2;
    //将字符串反转并且转换为数字保存到数组里面
    for (i = len1 - 1; i >= 0; i--)
    {
	a[j++] = str1[i] - '0';
    }
    j = 0;
    for (i = len2 - 1; i >= 0; i--)
    {
	b[j++] = str2[i] - '0';
    }
    for (i = 0; i < max; i++)
    {
	b[i] += a[i];	//相加
	if (b[i] >= 10)
	{
	    b[i] -= 10;
	    b[i + 1] += 1;	//产生进位
	}
    }
    if (b[max] != 0)
    {
	cout << b[max];
    }
    for (i = max - 1; i >= 0; i--)
    {
	cout << b[i];
    }
    cout << endl;
    return 0;
}

 

 大整数减法

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int a[201] = { 0 }, b[201] = { 0 }, c[201] = { 0 };
    int len_a, len_b, maxlen;
    char str1[200];
    char str2[200];
    //输入两个大整数 
    cin >> str1;
    cin >> str2;
    //获取大整数的长度 
    len_a = strlen(str1);
    len_b = strlen(str2);
    //大整数逆序存储 
    for (int i = 0; i < len_a; i++)
    {
	a[i] = str1[len_a - i - 1] - '0';
    }
    for (int i = 0; i < len_b; i++)
    {
	b[i] = str2[len_b - i - 1] - '0';
    }
    //去除大整数的前导0
    while (a[len_a - 1] == 0 && len_a > 1)
    {
	len_a;
    }
    while (b[len_b - 1] == 0 && len_b > 1)
    {
	len_b--;
    }
    maxlen = max(len_a, len_b);
    //若a<b,输出一个负号,并交换a和b,始终确保a存放较大数 
    if (len_a < len_b)
    {
	cout << '-';
	swap(a, b);
	swap(len_a, len_b);
    }
    if (len_a == len_b)
    {
	for (int i = len_a - 1, j = len_b - 1; i >= 0; i--)
	{
	    if (a[i] == b[i])
            {
		continue;
	    }
	    else if (a[i]>b[i])
	    {
		break;
	    }
	    else
	    {
	    	cout << '-';
		swap(a, b);
		swap(len_a, len_b);
		break;
	    }
	}
    }
    //计算a-b
    for (int i = 0; i < maxlen; i++)
    {
	if (a[i]<b[i])
	{
	    a[i] += 10;			//借位
	    a[i + 1]--;
	}
	c[i] = a[i] - b[i];
    }
    //去除结果中的前导0
    while (c[maxlen - 1] == 0 && maxlen>1)
    {
	maxlen--;
    }
    //输出结果 
    for (int i = maxlen - 1; i >= 0; i--)
    {
	cout << c[i];
    }
    cout << endl;
    return 0;
}

 

大整数除法

#include <iostream>
#include <cstring>
using namespace std;
//去除前导0
int DelZero(int x[], int len_x)
{
    int i = len_x;
    while (x[i - 1] == 0 && i > 1)
    {
	i--;
    }
    return i;
}
//逆序输出数组值 
void Show(int x[], int len_x)
{
    for (int i = len_x - 1; i >= 0; i--)
    {
	cout << x[i];
    }
    cout << endl;
}
//若x>=y返回true,否则返回false 
bool Compare(int x[], int y[], int len_x, int len_y)
{
    if (len_x < len_y)
    {
	return false;
    }
    if (len_x == len_y)
    {
	for (int i = len_x - 1; i >= 0; i--)
	{
	    if (x[i] > y[i])
	    {
		return true;
	    }
            if (x[i] < y[i])
	    {
		return false;
	    }
	}
	return true;
    }
    return true;
}
//若x>=y,则x的高位减去y(只减一次),返回值为x的新长度
int sub(int x[], int y[], int z[], int len_x, int len_y)
{
    int zLoc = len_x - len_y;    //商的位置 
    //若不够减,则商的位置后移一位 
    for (int i = 1; i <= len_y; i++)
    {
	if (x[len_x - i] > y[len_y - i])
	{
            break;
	}
	if (x[len_x - i] < y[len_y - i])
	{
	    zLoc--;
	    break;
	}
    }
    if (zLoc < 0)
    {
	return len_x;
    }
    //当前被除数x的高位与除数y做一次减法运算 
    for (int i = zLoc, j = 0; i < len_x && j < len_y; i++, j++)
    {
	while (x[i] < y[j])
	{
	    x[i + 1]--;
	    x[i] += 10;
	}
	x[i] -= y[j];
    }
    //商的相应位置加一 
    z[zLoc]++;
    //计算当前被除数x的真实长度 
    while (x[len_x - 1] == 0)
    {
	len_x--;
    }
    if (len_x <= 0)
    {
	len_x = 1;
    }
    return len_x;
}
int main()
{
    char str1[100], str2[100];
    cin >> str1;		//被除数
    cin >> str2;		//除数
    int a[100] = { 0 }, b[100] = { 0 }, c[100] = { 0 };
    int len_a = 0, len_b = 0, len_c = 1, maxlen = 0;
    int i;
    len_a = strlen(str1);
    len_b = strlen(str2);
    //被除数和除数分别逆序存放 
    for (i = 0; i < len_a; i++)
    {
	a[i] = str1[len_a - 1 - i] - '0';
    }
    for (i = 0; i < len_b; i++)
    {
	b[i] = str2[len_b - 1 - i] - '0';
    }
    //删除多余的0
    len_a = DelZero(a, len_a);
    len_b = DelZero(b, len_b);
    //通过从高位开始连续减去除数,计算商和余数 
    len_c = len_a - len_b + 1;
    while (Compare(a, b, len_a, len_b))
    {
	len_a = sub(a, b, c, len_a, len_b);
    }
    //解决商的位数是0或负数的情况 
    if (len_c < 1)
    {
	len_c = 1;
    }
    //去除商的前导0 
    len_c = DelZero(c, len_c);
    //输出商c 
    cout << "商是:";
    Show(c, len_c);
    //输出余数a 
    cout << "余数是:";
    Show(a, len_a);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值