博客
关于我
超大数相加
阅读量:167 次
发布时间:2019-02-28

本文共 2394 字,大约阅读时间需要 7 分钟。

以前刚进华为面试时,有一个超大数相加的题目,刚毕业那会儿比较嫩,还没做出来。现在想了一下,还是能做出来的。下面是我的思路和实现过程。

思路概述

  • 问题分析:超大数相加,不能用数据类型只能用字符串存取。
  • 字符处理:需要将每个字符转换成数字进行计算。
  • 进位处理:从右到左逐位相加,处理进位。
  • 字符串处理:反转字符串,进行计算后再反转回去。
  • 代码实现

    #include 
    #include
    int CheckString(char *p) { int len = strlen(p); for (int i = 0; i < len; i++) { if (p[i] < '0' || p[i] > '9') { puts("输入有误,请重新输入!!"); return 1; } } return 0;}int CheckSign(char a) { if ('+' == a) { return 0; } else { puts("运算符输入有误!!!"); return 1; }}void add(char *p1, char *p2) { int len1 = strlen(p1); int len2 = strlen(p2); int i = 0, j = 0, k = 0; int flag = 0, temp = 0; char str[100] = {0}; if (len2 > len1) { len1 = len2; p2 = p1; p1 = p2; p2 = p1; } for (i = len1 - 1, j = len2 - 1; j >= 0; j--, i--) { int a = p1[i] - '0'; int b = p2[j] - '0'; temp = a + b + flag; if (temp <= 9) { str[k++] = temp + '0'; flag = 0; } else { str[k++] = temp % 10 + '0'; flag = 1; } } for (; i >= 0; i--) { if (flag) { if (p1[i] == '9') { str[k++] = '0'; flag = 1; } else { str[k++] = p1[i] + 1; flag = 0; } } else { str[k++] = p1[i]; } k--; } if (flag) { str[0] = '1'; } puts(str);}int main() { char str1[100] = {0}; char str2[100] = {0}; char sign = 0; char res = 0; while (1) { printf("第一个数:"); gets(str1); int check = CheckString(str1); if (check) { continue; } printf("运算符:"); sign = getchar(); int signCheck = CheckSign(sign); if (signCheck) { continue; } printf("第二个数:"); gets(str2); int check2 = CheckString(str2); if (check2) { continue; } if (sign == '+') { add(str1, str2); } else { puts("运算符不支持!!!"); } }}

    代码解释

  • CheckString函数:检查输入字符串是否为数字,返回错误时提示信息。
  • CheckSign函数:检查运算符是否为加号,如果不是则提示错误。
  • add函数:实现大数相加,处理进位,逐位相加,最后处理最高位进位。
  • main函数:用户输入处理,调用相应函数进行验证和计算。
  • 改进思路

  • 简化代码:优化变量命名,减少重复代码。
  • 错误处理:更友好的错误提示,避免用户困惑。
  • 代码结构:分层次处理,提高代码可读性和维护性。
  • 性能优化:减少内存占用,提高处理效率。
  • 通过这样的实现,可以完成两个超大数的相加操作,虽然代码不够简洁,但思路清晰,逻辑严密。以后有机会的话,还可以进一步优化代码结构和错误处理机制。

    转载地址:http://tanj.baihongyu.com/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 实践教程|旋转目标检测模型-TensorRT 部署(C++)
    查看>>
    OpenCV与AI深度学习 | 工业缺陷检测中数据标注需要注意的几个事项
    查看>>
    OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
    查看>>
    OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 水下检测+扩散模型:或成明年CVPR最大惊喜!
    查看>>
    OpenCV与AI深度学习 | 深度学习检测小目标常用方法
    查看>>
    OpenCV与AI深度学习 | 超越YOLOv10/11、RT-DETRv2/3!中科大D-FINE重新定义边界框回归任务
    查看>>
    OpenCV与AI深度学习 | 高效开源的OCR工具:Surya-OCR介绍与使用
    查看>>
    OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)
    查看>>
    Opencv中KNN背景分割器
    查看>>
    OpenCV中基于已知相机方向的透视变形
    查看>>
    OpenCV中的监督学习
    查看>>
    opencv中读写视频
    查看>>
    OpenCV中遇到Microsoft C++ 异常 cv::Exception
    查看>>
    opencv之cv2.findContours和drawContours(python)
    查看>>
    opencv之namedWindow,imshow出现两个窗口
    查看>>
    opencv之模糊处理
    查看>>
    Opencv介绍及opencv3.0在 vs2010上的配置
    查看>>
    OpenCV使用霍夫变换检测图像中的形状
    查看>>
    opencv保存图片路径包含中文乱码解决方案
    查看>>