定制魏: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 // 定义最大尺寸为100
char 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_num
int i, j, k, len; // 声明整型变量i, j, k, len
char c; // 声明字符变量c
int flag=1; // 声明整型变量flag,并初始化为1
void 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);
else
substract(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 // 定义最大尺寸为100
string a; // 声明字符串'a'
string b; // 声明字符串'b'
string delta; // 声明字符串'delta'
int a_num, b_num, d_num; // 声明整型变量a_num, b_num, d_num
int i, j, k, len; // 声明整型变量i, j, k, len
char c; // 声明字符变量c
int flag=1; // 声明整型变量flag,并初始化为1
void 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);
else
substract(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;
}
}