前言 : 所谓大数就是指位数特别大,几百上千位数的这种数字 , 所以这一类的数据不能用简单的int , long 等基本数据类型所表示 .
最好的表达方式就是用字符串 , 然而字符串不能直接像数字一样相加相减 , 所以有了大数相加的算法
基本思想和普通的加法运算没有什么区别 , 只是处理的每一个数据从数字变成了字符 . 所以实现起来也比较简单
以下是(原创)代码 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * AddBigNumber(char *s,char *p); /* 函数声明 */
int Max(int a,int b);
int main()
{
char s[] = "111111";
char p[] = "9999";
puts(AddBigNumber(s,p));
return 0;
}
char* AddBigNumber(char *s,char *p)
{
int x = 0;
int len1 = strlen(s); /* 获得字符串长度 */
int len2 = strlen(p);
int len3 = Max(len1--,len2--) + 1; /* 结果的长度最大应为较长字符串长度+1 */
char *arr;
arr = (char*)malloc(sizeof(char)*(len3+1));
/* 为结果申请存储空间,+1是因为末尾有一个'\0' */
arr = &arr[len3]; /* 因为是从末尾开始相加,所以指针跳转到末尾 */
*arr = '\0';
while(len1 >= 0 || len2 >= 0) /* 当两个字符串都走完了才结束 */
{
if(len1 >= 0)
x += s[len1--] - '0';
if(len2 >= 0)
x += p[len2--] - '0';
*(--arr) = (x % 10) + '0'; /* 将结果对10取余赋给arr */
x /= 10; /* 重置为上一次运算的进位 */
}
if(x == 1) /* 如果循环完后还有进位 */
*(--arr) = '1';
return arr;
}
int Max(int a,int b)
{
return a > b ? a : b;
}
运算结果 :
char s[] = "111111111111111111111111111111111111111111111111";
char p[] = "999999999999999999999999999999999999999999999999999999999999999999999999";