您的位置:首页 > 其它

整数大数加法

2012-05-19 10:36 232 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * BigNumberAdd(const char *a, const char *b);

int main(void)
{
const char * a = "9879797978979798797";
const char * b = "97979797987979797979797979797987";
char * result = BigNumberAdd(a,b);
if ( result!= NULL )
{
printf("\n%s + %s = %s\n", a, b, result);
}
else
{
printf("result is NULL\n");
}
system("pause");
exit(EXIT_SUCCESS);
}

char * BigNumberAdd(const char *a, const char *b)
{
int i = 0;
int j = 0;

char memberOfA[2];
char memberOfB[2];

int lengthOfA = strlen(a);
int lengthOfB = strlen(b);

int a_index = lengthOfA - 1;  //数字A的最大索引号。因为加法是从最右边开始加起的嘛
int b_index = lengthOfB - 1;  //数字B的最大索引号。因为加法是从最右边开始加起的嘛

int maxLength = (lengthOfA>lengthOfB ? lengthOfA : lengthOfB) + 1; //结果的最大位数,+1是为了防止进位时长度不足

//printf("maxLength is %d\n", maxLength);

int * result = (int *)malloc( sizeof(int) * (maxLength) );
char * char_result = (char *)malloc( sizeof(char) * (maxLength) );

memset(result, 0,  sizeof(int) * (maxLength) );       //将result置0
memset(char_result, 0, sizeof(char) * (maxLength) );  //将char_result置0

if ( result!=NULL && char_result!=NULL )
{
fprintf(stdout, "分配内存成功,在文件%s中第%d行!!\n", __FILE__, __LINE__);
}
else
{
fprintf(stdout, "分配内存失败,在文件%s中第%d行!!\n", __FILE__, __LINE__);
return NULL;
}

//开始计算,最大的循环次数为结果的结果的最大长度
for (i=maxLength-1; i>=0; i--)
{
//将数字A最右边的数字取出来保存在 memberOfA中,不足位数的用0来补
if ( a_index >= 0 )
{
sprintf(memberOfA, "%c", a[a_index--]);
}
else
{
sprintf(memberOfA, "0");
}

//将数字B最右边的数字取出来保存在 memberOfA中,不足位数的用0来补
if ( b_index >= 0 )
{
sprintf(memberOfB, "%c", b[b_index--]);
}
else
{
sprintf(memberOfB, "0");
}

//将结果保存在result的最右边,类似于下面的计算,从最右边开始计算:
//   2 3
// + 4 8
// = 6 11

result[i] = atoi(memberOfA) + atoi(memberOfB);
//printf("memberOfA is %d, memberOfB is %d \n", atoi(memberOfA), atoi(memberOfB));
//printf("memberOfA is %s, memberOfB is %s \n", memberOfA, memberOfB);

}

//进位,从结果的最右边开始进位
for (i=maxLength-1; i>=0; i--)
{
if ( result[i] >= 10 )
{
result[i-1] += result[i] / 10;
result[i] = result[i]  % 10;
}
}

/*
for (i=0; i<maxLength; i++)
{
printf("result[%d] is %d \n", i, result[i]);
}
*/

i = 0;
while( result[i] == 0 )
{
i++;
}

for (j=0; i<maxLength; i++, j++)
{
char_result[j] =  result[i]+'0';
}
free(result);
result = NULL;
return char_result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  null include file system c