整数大数加法

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值