测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A24195. 大整数减法

填空题 困难

题目描述

大整数减法

题目描述

求两个大的正整数相减的差。

输入

共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。

输出

一行,即所求的差。

输入样例

9999999999999999999999999999999999999
9999999999999

输出样例

9999999999999999999999990000000000000

参考答案

#include <bits/stdc++.h> using namespace std; #define N 205 struct HPN { int a[N];//数字数组 HPN() { memset(a, 0, sizeof(a)); } HPN(char s[]) { memset(a, 0, sizeof(a)); a[0] = strlen(s); for(int i = 1; i <= a[0]; ++i) a[i] = s[a[0]-i] - '0'; setLen(a[0]); } void show() { for(int i = a[0]; i >= 1; --i) cout << a[i]; cout << endl; } int& operator [](int i)//类似数组取值 { return a[i]; } void setLen(int i)//从第i位置开始,向低位寻找,直到找到一个不为0的数位,更新数字长度 { while(a[i] == 0 && i > 1) i--; a[0] = i; } HPN operator - (HPN b)//高精减高精 前提本数字比b大 { HPN r; int i, c = 0;//c:借位 for(i = 1; i <= a[0]; ++i) { r[i] = a[i] - c - b[i]; c = 0; if(r[i] < 0) { c = 1; r[i] += 10; } } r.setLen(i); return r; } }; int main() { char s1[N], s2[N]; cin >> s1 >> s2; HPN n1(s1), n2(s2); HPN n3 = n1 - n2; n3.show(); return 0; }

答案解析

#include<bits/stdc++.h>

using namespace std;

#define N 205

//从数字数组a的第i位开始,删除高位的0

void setLen(int a[], int i)

{

while(a[i] == 0 && i > 1)//去除多余的0

       i--;

   a[0] = i;

}

//将字符数组转化为数字数组 数字数组从第1位置到第len位置,从低位到高位保存各位数字,第0位置保存数字位数

void toNum(char s[], int a[])

{

   a[0] = strlen(s);

   for(int i = 1; i <= a[0]; ++i)

       a[i] = s[a[0] - i] - '0';

}

//输出数字数组

void showNum(int a[])

{

   for(int i = a[0]; i >= 1; --i)

       cout << a[i];

   cout << endl;

}

void Minus(int a[], int b[], int r[])//数a大于等于数b

{

   int i, c = 0;

   for(i = 1; i <= a[0]; ++i)

   {

       r[i] = a[i] - c - b[i];

       c = 0;

       if(r[i] < 0)

       {

           c = 1;

           r[i] += 10;

       }

   }

   setLen(r, i);

}

int main()

{

   char s[N];

   int a[N] = {}, b[N] = {}, r[N] = {};

   cin >> s;

   toNum(s, a);

   cin >> s;

   toNum(s, b);

   Minus(a, b, r);

   showNum(r);

   return 0;

}

上一题 下一题