华为编程大赛--高精度加减法

2. 高精度整数加法(60分)

问题描述:

在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,

参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊

的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:

9876543210 + 1234567890 = ?

让字符串 num1="9876543210",字符串 num2="1234567890",结果保存在字符串 result = "11111111100"

-9876543210 + (-1234567890) = ?

让字符串 num1="-9876543210",字符串 num2="-1234567890",结果保存在字符串 result = "-11111111100"

要求编程实现上述高精度的十进制加法。

要求实现函数:

void add (const char *num1, const char *num2, char *result)

【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-'

nu2:字符串形式操作数2,如果操作数为负,则num2[0]为符号位'-'

【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。

注:

I   当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符串中,且一定在输入字符串最左边位置;

II  输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012", "-0012"不会出现;

III       要求输出字符串所有位均为有效数字,结果为正或0'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'

示例

输入:num1 = "580"

num2 = "-50"

输出:result = "530"

输入:num1 = "580"

num2 = "-600"

输出:result = "-20"

#include 
#include 
#include 

#define MAX_LEN 33

char * add_p(const char *a,const char *b)
{
	char *r;
	int tmp;
	int len_a = strlen(a);
	int len_b = strlen(b);
	int len = (len_a>len_b)?len_a+1:len_b+1;
	r = (char *)malloc(len*sizeof(char));
	r[len] = '\0';
	len--;
	
	int c = 0;
	len_a-=1;
	len_b-=1;
	while(len_a>=0 && len_b>=0)
	{
		tmp = a[len_a--] - '0' + b[len_b--] - '0';
		r[len--] = (tmp+c)%10 + '0';
		c = (tmp+c)/10;
	}
	while(len_a>=0)
	{
		tmp = c + a[len_a--] - '0';
		r[len--] = tmp%10 + '0';
		c = (tmp+c)/10;
	}
	while(len_b>=0)
	{
        tmp = c + b[len_b--] - '0';
		r[len--] = tmp%10 + '0';
		c = (tmp+c)/10;
	}
	if(!c)
		r++;
	else
		r[0] = c + 48;
	return r;
}

char * sub_p(const char *a,const char *b)
{
	char *r;
	int tmp;
	int len_a = strlen(a);
	int len_b = strlen(b);
	int len = (len_a>len_b)?len_a:len_b;
	r = (char *)malloc(len*sizeof(char));
	r[len] = '\0';
	len--;
	
	int c = 0;
	len_a-=1;
	len_b-=1;
	while(len_a>=0 && len_b>=0)
	{
		tmp = (a[len_a--] - '0') - (b[len_b--] - '0') - c;
		r[len--] = tmp>=0?(tmp+'0'):(tmp+10+'0');
		c = tmp<0?1:0;
	}
	while(len_a>=0)
	{
		tmp = a[len_a--] - '0' - c;
		r[len--] = tmp>=0?(tmp+'0'):(tmp+10+'0');
		c = tmp<0?1:0;
	}
	while(r[0] == '0')
		r++;
	if(!strlen(r))
		r = "0";
	return r;
}

void add (const char *num1, const char *num2, char *result)
{
	int flag1,flag2;
	char *r;
	flag1 = (num1[0] == '-')?-1:1;
	flag2 = (num2[0] == '-')?-1:1;
	
	if(flag1 == 1 && flag2 == 1)
	{
		r = add_p(num1,num2);
		for(unsigned int i=0;i strlen(num2)-1)
		{
			r = sub_p(num1,num2+1);
			for(unsigned int i=0;i strlen(num2))
		{
			r = sub_p(num1+1,num2);
			result[0] = '-';
			for(unsigned int i=0;i

这个题在下面能做出来,考试的时候就怕时间不够。。。。

你可能感兴趣的:(C/C++,华为,编程,高精度加减法)