oj题目 P1120 大整数加法,P1121 大整数减法

大整数加法

题目描述:

 200位以内的正整数已经超过了long long int可以表示的范围,所以不能将要相加的数定义为整数类型来做,可以借助字符数组来做,输入的时候将要相加的两个数看成字符串,然后在将该数所对应的字符数组转换为该数所对应的整数数组即可,将字符1转换位整型1的方式是将字符1所对应的ascll码减去字符0所对应的ascll码即可,然后将两个数组对应位置相加,但是这里要注意的是,在做加法前需要将两个数组先逆序,为什么呢?比如我们做1234567+77这个加法时我们需要做对齐操作,即个位对个位,十位对十位,然后再进行相加,所以将数组逆序的过程其实就是在做对齐工作,最后得到的结果也要进行逆序输出,当然对应位置相加的时候若对应位置之和超过10还要进行进位操作,比如两个对应位置上的数分别是9,8时,这个时候将两数进行性相加,在该位上得到的数字因该是7,然后向高位进1,这里我借助count来记录进位;算法实源代码以及运行结果截图如下:

算法源代码:


//大整数加法

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define N 202

//该函数用于将一个数组进行逆序
void reverse_order(int array[N], int n);

int main()
{
	int carry;
	int i, j;
	char num1[N], num2[N];
	while (scanf("%s", num1) != EOF)
	{
		carry = 0;
		scanf("%s", num2);
		int e1[N] = { 0 }, e2[N] = { 0 }, result[N] = { 0 };
		for (i = 0; num1[i] != '\0'; i++)
		{
			e1[i] = num1[i] - '0';
		}
		for (j = 0; num2[j] != '\0'; j++)
		{
			e2[j] = num2[j] - '0';
		}
		reverse_order(e1, i);
		reverse_order(e2, j);
		

		

		for (int k = 0; k < N; k++)
		{
			int sum = e1[k] + e2[k] + carry;
			if (sum >= 10)
			{
				result[k] = sum % 10;
				carry = 1;
			}
			else
			{
				carry = 0;
				result[k] = sum;
			}

		}
		int mark;
		for (int k = N-1; k >= 0; k--)
		{
			if (result[k] != 0)
			{
				mark = k;
				break;
			}
		}
		for (int k = mark; k >= 0; k--)
		{
			printf("%d", result[k]);
		}
		printf("\n");



	}
}

void reverse_order(int array[N], int n)
{
	int i = 0, j = n - 1;
	int temp;
	while (i != j && i < j)
	{
		temp = array[i];
		array[i] = array[j];
		array[j] = temp;
		i++;
		j--;

	}
}


运行结果截图:

大整数减

题目描述

大整数减法实现思路完全一样,只用在其基础上将对应位置相加改成对应位置相减即可,在进行对应位置相减的时候应该要注意,若第一个数的要进行相减的位置上的数小于第二个数对应位置上的数时,第一个数的该位置上的数应该向高位借1,比如第一个数要做减法操作的数现在是1,第二个个数对应位置上的数是2,那么第一位数的该位置应该向高位借1,凑满11然后在和第二个数的对应位置相减,相应地,第一位数的高位应该减1; 

算法实现源代码以及与运行截图:

算法源代码:

/大整数减法
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define N 202

//该函数用于将一个数组进行逆序
void reverse_order(int array[N], int n);

int main()
{
	int carry;
	int i, j;
	char num1[N], num2[N];
	while (scanf("%s", num1) != EOF)
	{
		scanf("%s", num2);
		int e1[N] = { 0 }, e2[N] = { 0 }, result[N] = { 0 };
		for (i = 0; num1[i] != '\0'; i++)
		{
			e1[i] = num1[i] - '0';
		}
		for (j = 0; num2[j] != '\0'; j++)
		{
			e2[j] = num2[j] - '0';
		}
		reverse_order(e1, i);
		reverse_order(e2, j);




		for (int k = 0; k < N; k++)
		{
			int differ = e1[k] - e2[k];
			if (differ<0)
			{
				result[k] = e1[k] + 10 - e2[k];
				e1[k + 1]--;
			}
			else
			{
				result[k] = differ;
			}

		}
		int mark=0;
		for (int k = N - 1; k >= 0; k--)
		{
			if (result[k] != 0)
			{
				mark = k;
				break;
			}
		}
		for (int k = mark; k >= 0; k--)
		{
			printf("%d", result[k]);
		}
		printf("\n");



	}
}

void reverse_order(int array[N], int n)
{
	int i = 0, j = n - 1;
	int temp;
	while (i != j && i < j)
	{
		temp = array[i];
		array[i] = array[j];
		array[j] = temp;
		i++;
		j--;

	}
}

运行结果截图:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值