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

    你可能感兴趣的文章
    Objective-C实现重载[ ](附完整源码)
    查看>>
    Objective-C实现链表(附完整源码)
    查看>>
    Objective-C实现链表交换节点算法(附完整源码)
    查看>>
    Objective-C实现阶乘递归factorialRecursive算法(附完整源码)
    查看>>
    Objective-C实现阿特巴希密算法(附完整源码)
    查看>>
    Objective-C实现随机图生成器算法(附完整源码)
    查看>>
    Objective-C实现随机数生成器(附完整源码)
    查看>>
    Objective-C实现隐藏任务栏(附完整源码)
    查看>>
    Objective-C实现雪花算法(附完整源码)
    查看>>
    Objective-C实现高斯消元法(附完整源码)
    查看>>
    Objective-C实现高斯消除算法(附完整源码)
    查看>>
    Objective-C实现高斯滤波GaussianBlur函数用法(附完整源码)
    查看>>
    Objective-C实现鸡兔同笼问题(附完整源码)
    查看>>
    Objective-C语法之代码块(block)的使用
    查看>>
    Objenesis创建类的实例
    查看>>
    OBObjective-c 多线程(锁机制) 解决资源抢夺问题
    查看>>
    OBS studio最新版配置鉴权推流
    查看>>
    Obsidian的使用-ChatGPT4o作答
    查看>>
    ObsoleteAttribute 可适用于除程序集、模块、参数或返回值以外的所有程序元素。 将元素标记为过时可以通知用户:该元素在产品的未来版本中将被移除。...
    查看>>
    OC Xcode快捷键
    查看>>