鱼C论坛

 找回密码
 立即注册
查看: 1851|回复: 6

[已解决]C\大数相加

[复制链接]
发表于 2018-11-12 19:37:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问大数相加(位数不确定)如何写程序,我想的是用数组或动态存储,但是不知道怎么存和怎么输出。
最佳答案
2018-11-12 20:29:09
本帖最后由 砚堂_ 于 2018-11-12 20:37 编辑

可以做到,就是有点繁琐。贴上C++的代码(只是用C++做了输入输出,别的部分和C语言是相通的)
这段代码只能进行正整数的相加,没有考虑小数,也没有考虑负数的情况。

  1. #include "pch.h"
  2. #include <iostream>
  3. using namespace std;
  4. const int MAX = 100;

  5. int main()
  6. {
  7.         cout << "大整数相加" << endl;
  8.         cout << "请输入第一个整数:" << endl;
  9.         char* a = new char[MAX] {0};
  10.         cin >> a;
  11.         cout << "请输入第二个整数:" << endl;
  12.         char* b = new char[MAX] {0};
  13.         cin >> b;
  14.         char* c = new char[MAX] {0};
  15.         //核心代码
  16.         int m = 0, n = 0;        //位数
  17.         while (a[m]) m++;
  18.         while (b[n]) n++;
  19.         int r = m > n ? m + 1 : n + 1;        //结果最多比原数据多1位
  20.         int carry = 0;        //加法进位
  21.         m--, n--, r--;  //数组下标从0开始
  22.         while (m >= 0 && n >= 0)
  23.         {
  24.                 c[r] = a[m--] + b[n--] - '0'*2 + carry;
  25.                 carry = c[r] / 10;  //进位
  26.                 c[r] = c[r]%10+'0';                        //本位
  27.                 r--;
  28.         }
  29.         while (m >= 0)
  30.         {
  31.                 c[r] = a[m--] -'0' + carry;
  32.                 carry = c[r] / 10;
  33.                 c[r] = c[r] % 10 + '0';
  34.                 r--;
  35.         }
  36.         while (n >= 0)
  37.         {
  38.                 c[r] = a[n--] -'0' + carry;
  39.                 carry = c[r] / 10;
  40.                 c[r] = c[r] % 10 + '0';
  41.                 r--;
  42.         }
  43.         char* result;
  44.         if (carry == 1)
  45.         {
  46.                 c[0] = 1+'0';
  47.                 result = c;
  48.         }
  49.         else
  50.         {
  51.                 result = &c[1];
  52.         }
  53.         cout << r;
  54.         cout << "结果是:" << endl;
  55.         cout << result << endl;

  56.         getchar();
  57.         delete a;
  58.         delete b;
  59.         delete c;
  60.         return 0;

  61. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-11-12 19:52:46 | 显示全部楼层
就存在字符串里吧,然后模拟加法,进位什么的。我也去试试哦。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-12 20:29:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 砚堂_ 于 2018-11-12 20:37 编辑

可以做到,就是有点繁琐。贴上C++的代码(只是用C++做了输入输出,别的部分和C语言是相通的)
这段代码只能进行正整数的相加,没有考虑小数,也没有考虑负数的情况。

  1. #include "pch.h"
  2. #include <iostream>
  3. using namespace std;
  4. const int MAX = 100;

  5. int main()
  6. {
  7.         cout << "大整数相加" << endl;
  8.         cout << "请输入第一个整数:" << endl;
  9.         char* a = new char[MAX] {0};
  10.         cin >> a;
  11.         cout << "请输入第二个整数:" << endl;
  12.         char* b = new char[MAX] {0};
  13.         cin >> b;
  14.         char* c = new char[MAX] {0};
  15.         //核心代码
  16.         int m = 0, n = 0;        //位数
  17.         while (a[m]) m++;
  18.         while (b[n]) n++;
  19.         int r = m > n ? m + 1 : n + 1;        //结果最多比原数据多1位
  20.         int carry = 0;        //加法进位
  21.         m--, n--, r--;  //数组下标从0开始
  22.         while (m >= 0 && n >= 0)
  23.         {
  24.                 c[r] = a[m--] + b[n--] - '0'*2 + carry;
  25.                 carry = c[r] / 10;  //进位
  26.                 c[r] = c[r]%10+'0';                        //本位
  27.                 r--;
  28.         }
  29.         while (m >= 0)
  30.         {
  31.                 c[r] = a[m--] -'0' + carry;
  32.                 carry = c[r] / 10;
  33.                 c[r] = c[r] % 10 + '0';
  34.                 r--;
  35.         }
  36.         while (n >= 0)
  37.         {
  38.                 c[r] = a[n--] -'0' + carry;
  39.                 carry = c[r] / 10;
  40.                 c[r] = c[r] % 10 + '0';
  41.                 r--;
  42.         }
  43.         char* result;
  44.         if (carry == 1)
  45.         {
  46.                 c[0] = 1+'0';
  47.                 result = c;
  48.         }
  49.         else
  50.         {
  51.                 result = &c[1];
  52.         }
  53.         cout << r;
  54.         cout << "结果是:" << endl;
  55.         cout << result << endl;

  56.         getchar();
  57.         delete a;
  58.         delete b;
  59.         delete c;
  60.         return 0;

  61. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-12 22:52:32 | 显示全部楼层
谢谢,我也是想到c++的输入输出可能容易一些,但是用C是可以输入输出的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-13 07:59:40 | 显示全部楼层
lemon3 发表于 2018-11-12 22:52
谢谢,我也是想到c++的输入输出可能容易一些,但是用C是可以输入输出的吗?

你把核心代码前后的改掉不就行了
测测有没有问题吧,然后标为已解决吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-13 20:45:44 | 显示全部楼层
lemon3 发表于 2018-11-12 22:52
谢谢,我也是想到c++的输入输出可能容易一些,但是用C是可以输入输出的吗?

当然可以啊。我不用printf函数是因为我编译器老是警告不安全,我懒得调...
另外第4行的常量定义好像也是C++的特性,可以改成#define MAX 100
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-14 14:16:50 | 显示全部楼层
抱歉,我在网上看了一些配置,找到了pch的一些东西,没找到最后一步怎么做,我的visual里面无法识别pch.
https://blog.csdn.net/Acheld/article/details/52693646?utm_source=blogxgwz6
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 12:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表