博客
关于我
超大数相加
阅读量: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/

    你可能感兴趣的文章
    OpenMCU(五):STM32F103时钟树初始化分析
    查看>>
    OpenMCU(四):STM32F103启动汇编代码分析
    查看>>
    OpenMetadata 命令执行漏洞复现(CVE-2024-28255)
    查看>>
    OpenMMLab | AI玩家已上线!和InternLM解锁“谁是卧底”新玩法
    查看>>
    OpenMMLab | S4模型详解:应对长序列建模的有效方法
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>
    OpenMMLab | 不是吧?这么好用的开源标注工具,竟然还有人不知道…
    查看>>
    OpenMMLab | 如何解决大模型长距离依赖问题?HiPPO 技术深度解析
    查看>>
    OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
    查看>>
    OpenMP 线程互斥锁
    查看>>
    OpenMV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    OpenObserve云原生可观测平台本地Docker部署与远程访问实战教程
    查看>>
    openoffice使用总结001---版本匹配问题unknown document format for file: E:\apache-tomcat-8.5.23\webapps\ZcnsDms\
    查看>>
    views
    查看>>
    OpenPPL PPQ量化(2):离线静态量化 源码剖析
    查看>>
    OpenPPL PPQ量化(3):量化计算图的加载和预处理 源码剖析
    查看>>
    OpenPPL PPQ量化(4):计算图的切分和调度 源码剖析
    查看>>
    OpenPPL PPQ量化(5):执行引擎 源码剖析
    查看>>
    openpyxl 模块的使用
    查看>>
    OpenResty & Nginx:详细对比与部署指南
    查看>>