定制魏:QTWZPW,获取更多源码等
[问题描述]
编写程序实现两个超长正整数(每个最长80位数字)的减法运算。
[输入形式]
从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。
1.第一行是超长正整数A;
2.第二行是超长正整数B;
[输出形式]
输出只有一行,是长整数A减去长整数B的运算结果,从高到低依次输出各位数字。要求:若结果为0,则只输出一个0;否则输出的结果的最高位不能为0,并且各位数字紧密输出。[输入样例]
234098
134098703578230056
[输出样例]
-134098703577995958
[样例说明]
进行两个正整数减法运算,234098-134098703578230056=-134098703577995958。
c实现
#include <stdio.h> // 包含标准输入输出库
#include <string.h> // 包含字符串处理库
#define maxsize 100 // 定义最大尺寸为100char a[maxsize]; // 声明字符数组'a',大小为maxsize
char b[maxsize]; // 声明字符数组'b',大小为maxsize
char delta[maxsize]; // 声明字符数组'delta',大小为maxsize
int a_num, b_num, d_num; // 声明整型变量a_num, b_num, d_numint i, j, k, len; // 声明整型变量i, j, k, len
char c; // 声明字符变量c
int flag=1; // 声明整型变量flag,并初始化为1void reverse(char s[]){int len = strlen(s);for(i=0,j=len-1;i<j;i++,j--){c=s[i];s[i]=s[j];s[j]=c;}
}void deletechar(char s[],char c){int length=strlen(s);int i,j;for(i=0,j=0;s[i]!='\0';i++){if(s[i]!=c)s[j++]=s[i];}s[j]='\0';
}void substract(char a[],char b[]){for(i=0;i<len;i++){a_num=a[i]-'0';b_num=b[i]-'0';if(a_num>=b_num)delta[i]='0'+a_num-b_num;else{delta[i]='0'+10+a_num-b_num;if(i!=len-1)a[i+1]=a[i+1]-1;}}
}int main()
{gets(a); // 获取输入的第一个大整数gets(b); // 获取输入的第二个大整数deletechar(a,' '); // 删除第一个大整数中的空格deletechar(b,' '); // 删除第二个大整数中的空格reverse(a); // 反转第一个大整数reverse(b); // 反转第二个大整数int len_a=strlen(a); // 获取第一个大整数的长度int len_b=strlen(b); // 获取第二个大整数的长度// 将两个大整数补齐成相同长度if(len_a > len_b){for(i = len_b; i < len_a; i++)b[i]='0';} else {for(i = len_a; i < len_b; i++)a[i]='0';if(len_b > len_a)flag = -1;else {for(i = 0; i < len_a; i++){if(a[i] < b[i]){flag = -1;break;}}}}len = (len_a > len_b) ? len_a : len_b; // 计算最终的长度// 根据标志位进行相减操作if(flag == -1)substract(b, a);elsesubstract(a, b);reverse(delta); // 反转结果if(flag == -1)printf("-"); // 输出结果前添加负号// 输出最终结果for(i = 0; i < len && delta[i] == '0'; i++);if(i == len)printf("0\n");else{for(; i < len; i++)printf("%c", delta[i]);}
}
c++实现
#include <iostream> // 包含标准输入输出流库
#include <string> // 包含字符串处理库
#include <algorithm> // 包含算法库using namespace std; // 使用标准命名空间#define maxsize 100 // 定义最大尺寸为100string a; // 声明字符串'a'
string b; // 声明字符串'b'
string delta; // 声明字符串'delta'int a_num, b_num, d_num; // 声明整型变量a_num, b_num, d_numint i, j, k, len; // 声明整型变量i, j, k, len
char c; // 声明字符变量c
int flag=1; // 声明整型变量flag,并初始化为1void reverse(string &s) {int len = s.length();for (i = 0, j = len - 1; i < j; i++, j--) {c = s[i];s[i] = s[j];s[j] = c;}
}void deletechar(string &s, char c) {s.erase(remove_if(s.begin(), s.end(), [c](char x){return x == c;}), s.end());
}void substract(string &a, string &b) {for (i = 0; i < len; i++) {a_num = a[i] - '0';b_num = b[i] - '0';if (a_num >= b_num)delta[i] = '0' + a_num - b_num;else {delta[i] = '0' + 10 + a_num - b_num;if (i != len - 1)a[i + 1] = a[i + 1] - 1;}}
}int main() {getline(cin, a); // 获取输入的第一个大整数getline(cin, b); // 获取输入的第二个大整数deletechar(a, ' '); // 删除第一个大整数中的空格deletechar(b, ' '); // 删除第二个大整数中的空格reverse(a); // 反转第一个大整数reverse(b); // 反转第二个大整数int len_a = a.length(); // 获取第一个大整数的长度int len_b = b.length(); // 获取第二个大整数的长度// 将两个大整数补齐成相同长度if (len_a > len_b) {b.append(len_a - len_b, '0');} else {a.append(len_b - len_a, '0');if (len_b > len_a)flag = -1;else {for (i = 0; i < len_a; i++) {if (a[i] < b[i]) {flag = -1;break;}}}}len = max(len_a, len_b); // 计算最终的长度delta.resize(len); // 调整delta的大小// 根据标志位进行相减操作if (flag == -1)substract(b, a);elsesubstract(a, b);reverse(delta); // 反转结果if (flag == -1)cout << "-"; // 输出结果前添加负号// 输出最终结果for (i = 0; i < len && delta[i] == '0'; i++);if (i == len)cout << "0" << endl;else {for (; i < len; i++)cout << delta[i];cout << endl;}
}