实现两个超长正整数(每个最长80位数字)的减法运算。

 定制魏: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;
    }
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值