21xrx.com
2024-12-22 23:52:00 Sunday
登录
文章检索 我的文章 写文章
C++实现多位数四则运算
2023-07-04 20:29:46 深夜i     --     --
C++ 多位数 四则运算 实现 计算器

在程序设计中,实现多位数的四则运算是非常基础且常见的问题。C++作为一门高级编程语言,其也能很好地解决这个问题。下面我们来一步步学习如何实现多位数四则运算。

1.实现多位数加法:

首先,我们需要实现多位数加法。多位数加法其实就是模拟人们手算加法的过程。

例如,我们需要计算132456 + 789321,步骤如下:

1) 从个位开始,相加得到第一位3,将3写在答案的个位上;

2) 继续相加得到第二位7,将7写在答案的十位上;

3) 以此类推,最后得到答案921777。

我们利用C++的数组和循环语句,就可以轻松实现这个过程。具体实现可以参考下面的代码:


#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

const int N = 1000;

char a[N], b[N], ans[N]; // 数组a和b存储要相加的数,数组ans存储答案

int lena, lenb, lenans; // lena和lenb表示a和b的位数,lenans表示答案的位数

int main()

{

  scanf("%s%s", a, b); // 输入要相加的两个数

  lena = strlen(a), lenb = strlen(b); // 计算两个数的位数

  int t = 0; // t表示进位

  for(int i = 0; i < lena || i < lenb; i++) // 从低位到高位一位一位地相加

  {

    int x = i < lena ? a[lena - i - 1] - '0' : 0; // 将字符转换成数字,如果超出字符串的范围就当成0

    int y = i < lenb ? b[lenb - i - 1] - '0' : 0;

    ans[i] = (x + y + t) % 10 + '0'; // 计算两位相加后的数字,并转换成字符存储在答案数组中

    t = (x + y + t) / 10; // 计算进位

  }

  if(t) ans[lenans++] = t + '0'; // 如果有进位,将进位的数字加到答案的最高位上

  for(int i = lenans - 1; i >= 0; i--) // 输出答案

    cout << ans[i];

  return 0;

}

2.实现多位数减法:

多位数减法的实现思路与多位数加法类似,仍然是模拟人们手算减法的过程。

例如,我们需要计算96472 - 35698,步骤如下:

1) 从个位开始,96472-35698=60774,将4写在答案的个位上;

2) 继续计算,60774-7=60767,将7写在答案的十位上;

3) 以此类推,最后得到答案60774。

同样地,我们可以利用C++的数组和循环语句实现多位数减法。具体实现可以参考下面的代码:


#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

const int N = 1000;

char a[N], b[N], ans[N]; // 数组a和b存储要相减的数,数组ans存储答案

int lena, lenb, lenans; // lena和lenb表示a和b的位数,lenans表示答案的位数

int main()

{

  scanf("%s%s", a, b); // 输入要相减的两个数

  lena = strlen(a), lenb = strlen(b); // 计算两个数的位数

  int t = 0; // t表示借位

  for(int i = 0; i < lena; i++) // 从低位到高位一位一位地相减

  {

    int x = a[lena - i - 1] - '0'; // 将字符转换成数字

    int y = i < lenb ? b[lenb - i - 1] - '0' : 0;

    x = x - t; // 减去借位

    t = 0; // 关键:每次循环都要将上次的借位清零

    if(x < y) // 如果需要借位

    {

      x += 10; // 先加10

      t = 1; // 标记需要借位

    }

    ans[i] = x - y + '0'; // 计算两位相减后的数字,并转换成字符存储在答案数组中

  }

  lenans = lena; // 答案的位数为被减数的位数

  while(lenans > 1 && ans[lenans - 1] == '0') lenans--; // 去掉前导0

  for(int i = lenans - 1; i >= 0; i--) // 输出答案

    cout << ans[i];

  return 0;

}

3.实现多位数乘法:

多位数乘法的实现相对复杂一些,但仍然可以通过模拟人们手算乘法的过程来实现。

例如,我们需要计算8645 × 2931,步骤如下:

1) 从个位845开始,与291逐位相乘,得到512345;

2) 从十位64开始,与293逐位相乘,得到18792,将它向左移动一位变成187920;

3) 枚举所有的位数,将它们相加得到答案25268195。

同样地,我们可以利用C++的数组和循环语句实现多位数乘法。具体实现可以参考下面的代码:


#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

const int N = 1000;

char a[N], b[N], ans[N * 2]; // 数组a和b存储要相乘的数,数组ans存储答案

int lena, lenb, lenans; // lena和lenb表示a和b的位数,lenans表示答案的位数

int main()

{

  scanf("%s%s", a, b); // 输入要相乘的两个数

  lena = strlen(a), lenb = strlen(b); // 计算两个数的位数

  for(int i = 0; i < lena; i++) // 枚举a的每一位

    for(int j = 0; j < lenb; j++) // 枚举b的每一位

    {

      int x = a[i] - '0', y = b[j] - '0'; // 将字符转换成数字

      ans[i + j] += x * y % 10; // 将当前位的乘积累加到答案的对应位置上

      ans[i + j + 1] += x * y / 10; // 将进位累加到下一位

    }

  lenans = lena + lenb - 1; // 计算答案的位数

  for(int i = 0; i < lenans; i++) // 处理进位

  {

    ans[i + 1] += ans[i] / 10;

    ans[i] %= 10;

  }

  if(ans[lenans]) lenans++; // 处理最高位的进位

  for(int i = lenans - 1; i >= 0; i--) // 反向输出答案

    cout << (char)(ans[i] + '0');

  return 0;

}

4.实现多位数除法:

多位数除法的实现相对困难一些,需要用到高精度的除法算法。这里我们介绍一种简便的高精度除法算法——二分搜索,具体实现如下:


#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

const int N = 1000;

char a[N], b[N], ans[N]; // 数组a和ans存储要相除的数,数组b存储整数除数

int lena, lenb, lenans; // lena和lenans表示a和ans的位数,lenb表示b的位数

bool check(char mid[]) // 检查mid是否符合条件

{

  lenans = 0; // 关键:每次调用check都要将上次的结果初始化

  int t = 0; // t表示余数

  for(int i = lena - 1; i >= 0; i--) // 竖式除法的模拟

  {

    t = t * 10 + a[i] - '0'; // 将余数t和当前位的数字a[i]合并

    ans[i] = t / (mid[0] - '0') + '0'; // 计算商

    t %= mid[0] - '0'; // 计算余数

    if(ans[i] != '0' || lenans) lenans++; // 去掉前导0

  }

  for(int i = 0; i < lenans / 2; i++) // 判断商是否合法

    swap(ans[i], ans[lenans - i - 1]); // 翻转答案数组,方便判断

  if(t != 0) return false;

  for(int i = 0; i < lenans - lenb; i++)

    if(ans[i] != '0')

      return true;

  for(int i = lenans - lenb; i < lenans; i++)

    if(ans[i] != b[i - lenans + lenb])

      return true;

  return false;

}

int main()

{

  scanf("%s%s", a, b); // 输入要相除的数和整数除数

  lena = strlen(a), lenb = strlen(b); // 计算两个数的位数

  char l = '1', r = '9', mid[N]; // l和r是枚举的上下界,mid是中间数

  while(l < r) // 二分搜索

  {

    mid[0] = (l + r + 1) / 2; // 计算中间数

    if(check(mid)) // 判断中间数是否合法

      l = mid[0]; // 范围变为[mid, r]

    else

      r = mid[0] - 1; // 范围变为[l, mid-1]

  }

  check(&r); // 计算答案

  for(int i = lenans - 1; i >= 0; i--) // 输出答案

    cout << ans[i];

  return 0;

}

以上就是C++实现多位数四则运算的方法和技巧。类似的问题还有很多,希望大家多动手练习。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复