本文共 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("运算符不支持!!!"); } }}
通过这样的实现,可以完成两个超大数的相加操作,虽然代码不够简洁,但思路清晰,逻辑严密。以后有机会的话,还可以进一步优化代码结构和错误处理机制。
转载地址:http://tanj.baihongyu.com/