BUAA数据结构第一次作业题解——超长正整数减法

【问题描述】
编写程序实现两个超长正整数(每个最长80位数字)的减法运算。
 
【输入形式】

从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。
1. 第一行是超长正整数A;
2. 第二行是超长正整数B;
 
【输出形式】
输出只有一行,是长整数A减去长整数B的运算结果,从高到低依次输出各位数字。要求:若结果为0,则只输出一个0;否则输出的结果的最高位不能为0,并且各位数字紧密输出。
 【输入样例】
 
234098
134098703578230056
 
【输出样例】
 -134098703577995958

【样例说明】
进行两个正整数减法运算, 234098 -134098703578230056 = -134098703577995958。
 
【评分标准】
 完全正确得20分,每个测试点4分,提交程序文件名为subtract.c。

【思路】
1.首先去掉整数开头可能出现的'0',得到有效部分
2.与上一题类似也是分情况讨论。
3.分情况之后加减法注意借位的计算即可

#include <stdio.h>
#include <string.h>
#include <math.h>
char s1[100], s2[100];
char result[100];
char temp1[100], temp2[100];
char sum[100];



int main() {
	scanf("%s", s1);
	scanf("%s", s2);
	int x1 = strlen(s1), x2 = strlen(s2);
	int q1 = 0, q2 = 0, d = 0, d1 = 0, d2 = 0;
	int j = 0, f = 0, l = 0, y = 0, i = 0;
	int bor;
	int len1, len2;
	char temp;
	for (int z = 0; z <= x1; z++) {
		if (s1[z] != '0') {
			q1 = z;
			break;
		}
	}
	for (int z = 0; z <= x2; z++) {
		if (s2[z] != '0') {
			q2 = z;
			break;
		}
	}
	len1 = x1 - q1, len2 = x2 - q2;
	f = x2 - 1;


	if (len1 > len2) {
		for (int o = x1 - 1; o >= q1; o--) {
			if (f >= q2) {
				if (s1[o] >= s2[f]) {
					result[j] = s1[o] - s2[f] + '0';
					j++, f--;
				} else {
					result[j] = '9' + 1 - (s2[f] - s1[o]);


					if (s1[o - 1] == '0') {

						bor = o - 1;
						while (s1[bor] == '0') {
							s1[bor] = '9';
							bor--;
						}

						s1[bor] -= ('1' - '0');
					} else {

						s1[o - 1] -= ('1' - '0');
					}
					j++, f--;


				}
			} else {
				for (int w = 0; w < abs(x1 - x2); w++) {
					result[j] = s1[o];
					j++, o--;
				}
			}
		}
		for (int r = j - 1; r >= 0; r--) {
			if (result[r] != '0') {
				l = r;
				break;
			}
		}
		d = l;
		for (l, i; i <= l; l--, i++) {
			temp = result[l];
			result[l] = result[i];
			result[i] = temp;
		}
		for (int t = 0; t <= d; t++) {
			printf("%c", result[t]);
		}
	}



	if (len1 == len2) {
		d1 = q1, d2 = q2;
		for (int i = 0; i <= len1; i++) {
			temp1[i] = s1[d1];
			d1++;
		}
		for (int i = 0; i <= len2; i++) {
			temp2[i] = s2[d2];
			d2++;
		}


		if (strcmp(temp1, temp2) > 0) {
			for (int o = x1 - 1; o >= q1; o--) {
				if (f >= q2) {
					if (s1[o] >= s2[f]) {
						result[j] = s1[o] - s2[f] + '0';
						j++, f--;
					} else {
						result[j] = '9' + 1 - (s2[f] - s1[o]);

						if (s1[o - 1] == '0') {

							bor = o - 1;
							while (s1[bor] == '0') {
								s1[bor] = '9';
								bor--;
							}

							s1[bor] -= ('1' - '0');
						} else {

							s1[o - 1] -= ('1' - '0');
						}
						j++, f--;
					}
				} else {
					for (int w = 0; w < abs(x1 - x2); w++) {
						result[j] = s1[o];
						j++, o--;
					}
				}
			}
			for (int r = j - 1; r >= 0; r--) {
				if (result[r] != '0') {
					l = r;
					break;
				}
			}
			d = l;
			for (l, i; i <= l; l--, i++) {
				temp = result[l];
				result[l] = result[i];
				result[i] = temp;
			}
			for (int t = 0; t <= d; t++) {
				printf("%c", result[t]);
			}
		} else if (strcmp(temp1, temp2) == 0) {
			printf("0");
		} else {
			f = x1 - 1;
			for (int o = x2 - 1; o >= q2; o--) {
				if (f >= q1) {
					if (s2[o] >= s1[f]) {
						result[j] = s2[o] - s1[f] + '0';
						j++, f--;
					} else {
						result[j] = '9' + 1 - (s1[f] - s2[o]);
						if (s2[o - 1] == '0') {

							bor = o - 1;
							while (s2[bor] == '0') {
								s2[bor] = '9';
								bor--;
							}

							s2[bor] -= ('1' - '0');
						} else {

							s2[o - 1] -= ('1' - '0');
						}
						j++, f--;
					}
				} else {
					for (int w = 0; w < abs(x1 - x2); w++) {
						result[j] = s2[o];
						j++, o--;
					}
				}
			}
			for (int r = j - 1; r >= 0; r--) {
				if (result[r] != '0') {
					l = r;
					break;
				}
			}
			d = l;
			for (l, i; i <= l; l--, i++) {
				temp = result[l];
				result[l] = result[i];
				result[i] = temp;
			}

			printf("-");
			for (int t = 0; t <= d; t++) {
				printf("%c", result[t]);
			}
		}

	}



	if (len1 < len2) {
		f = x1 - 1;
		for (int o = x2 - 1; o >= q2; o--) {
			if (f >= q1) {
				if (s2[o] >= s1[f]) {
					result[j] = s2[o] - s1[f] + '0';
					j++, f--;
				} else {
					result[j] = '9' + 1 - (s1[f] - s2[o]);

					if (s2[o - 1] == '0') {

						bor = o - 1;
						while (s2[bor] == '0') {
							s2[bor] = '9';
							bor--;
						}

						s2[bor] -= ('1' - '0');
					} else {

						s2[o - 1] -= ('1' - '0');
					}
					j++, f--;
				}
			} else {
				for (int w = 0; w < abs(x1 - x2); w++) {
					result[j] = s2[o];
					j++, o--;
				}
			}
		}
		for (int r = j - 1; r >= 0; r--) {
			if (result[r] != '0') {
				l = r;
				break;
			}
		}
		d = l;
		for (l, i; i <= l; l--, i++) {
			temp = result[l];
			result[l] = result[i];
			result[i] = temp;
		}
		printf("-");
		for (int t = 0; t <= d; t++) {
			printf("%c", result[t]);
		}
	}

	return 0;
}

【思路】
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值