C++超长正整数的减法

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

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

//超长正整数的减法
#include<stdio.h>
#include<string.h>
#include<iostream>
int c[100];
int judge(char a[], char b[])//判断前后位数
{
    int i,j;
    j=strlen(a);
    if (strlen(a) < strlen(b)) 
	{
        return 0;
    }
    else if (strlen(a) > strlen(b)) 
	{
        return 1;
    }
    for (i = 0; i < j; i++)//此时两个数的位数相同 
	{
    if (a[i] < b[i]) 
	{
        return 0;
    }
    }
        return 1;
    }//结果大于等于零返回1,结果小于零返回0
void minus(char a[], char b[], int k1, int k2)
{
    int i, x, y;
    x=strlen(a);
    y=strlen(b);
    char k;
    for (i = 0; i<k1; i
### 正整数减法算法实现 正整数减法的实现可以通过多种方式完成,包括使用数组、字符串或者位运算等方法。以下是基于引用内容和专业知识的详细说明。 #### 使用数组或字符串实现加法 在处理大整数时,通常会将数字存储为字符串或数组的形式,逐位进行加法运算。以下是一个 C++ 的实现示例[^1]: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> add(vector<int> A, vector<int> B) { vector<int> C; int t = 0; // 进位 for (int i = 0; i < A.size() || i < B.size(); ++i) { if (i < A.size()) t += A[i]; if (i < B.size()) t += B[i]; C.push_back(t % 10); // 当前位的结果 t /= 10; // 更新进位 } if (t) C.push_back(t); // 如果最后还有进位 return C; } int main() { string a, b; cin >> a >> b; vector<int> A, B; for (char c : a) A.push_back(c - '0'); for (char c : b) B.push_back(c - '0'); vector<int> C = add(A, B); reverse(C.begin(), C.end()); for (int i : C) cout << i; return 0; } ``` 上述代码通过将输入字符串转换为数字向量,并逐位相加,同时处理进位问题。 #### 使用数组或字符串实现减法 类似地,减法也可以通过逐位计算来实现。以下是一个减法的实现示例[^2]: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> subtract(vector<int> A, vector<int> B) { vector<int> C; int t = 0; // 借位 for (int i = 0; i < A.size(); ++i) { t = A[i] - t; if (i < B.size()) t -= B[i]; C.push_back((t + 10) % 10); // 处理负数情况 if (t < 0) t = 1; // 需要借位 else t = 0; } while (C.size() > 1 && C.back() == 0) C.pop_back(); // 去除前导零 return C; } int main() { string a, b; cin >> a >> b; vector<int> A, B; for (char c : a) A.push_back(c - '0'); for (char c : b) B.push_back(c - '0'); if (A.size() < B.size() || (A.size() == B.size() && A < B)) { swap(A, B); cout << "-"; } vector<int> C = subtract(A, B); reverse(C.begin(), C.end()); for (int i : C) cout << i; return 0; } ``` 上述代码实现了大整数减法,确保在借位时正确处理每一位的值[^2]。 #### 使用位运算实现加减法 除了传统的逐位计算外,还可以通过位运算实现加减法。例如,加法可以通过异或 (^) 和与 (&) 操作完成,而减法则可以利用补码机制实现[^3]。 ```cpp #include <iostream> using namespace std; int add(int a, int b) { while (b != 0) { int carry = (unsigned int)(a & b) << 1; // 计算进位 a = a ^ b; // 不带进位的加法 b = carry; // 更新进位 } return a; } int subtract(int a, int b) { while (b != 0) { int borrow = (~a) & b; // 计算借位 a = a ^ b; // 不带借位的减法 b = borrow << 1; // 更新借位 } return a; } int main() { int a, b; cin >> a >> b; cout << "Add: " << add(a, b) << endl; cout << "Subtract: " << subtract(a, b) << endl; return 0; } ``` 上述代码展示了如何通过位运算实现加减法,适用于较小范围内的整数运算[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值