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 <cstdio> #include <cstring> #include <cstdlib> #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(r);i++) { result[i] = r[i]; } result[strlen(r)] = '\0'; } else if(flag1 == -1 && flag2 == -1) { r = add_p(num1+1,num2+1); result[0] = '-'; for(unsigned int i=0;i<strlen(r);i++) { result[i+1] = r[i]; } result[strlen(r)+1] = '\0'; } else if(flag1 == 1 && flag2 == -1) { if(strlen(num1) > strlen(num2)-1) { r = sub_p(num1,num2+1); for(unsigned int i=0;i<strlen(r);i++) { result[i] = r[i]; } result[strlen(r)] = '\0'; } else if(strlen(num1) < strlen(num2)-1) { r = sub_p(num1,num2+1); result[0] = '-'; for(unsigned int i=0;i<strlen(r);i++) { result[i+1] = r[i]; } result[strlen(r)+1] = '\0'; } else if(strcmp(num1,num2+1)) { r = sub_p(num1,num2+1); for(unsigned int i=0;i<strlen(r);i++) { result[i] = r[i]; } result[strlen(r)] = '\0'; } else { r = sub_p(num1,num2+1); result[0] = '-'; for(unsigned int i=0;i<strlen(r);i++) { result[i+1] = r[i]; } result[strlen(r)+1] = '\0'; } } else { if(strlen(num1)-1 > strlen(num2)) { r = sub_p(num1+1,num2); result[0] = '-'; for(unsigned int i=0;i<strlen(r);i++) { result[i+1] = r[i]; } result[strlen(r)+1] = '\0'; } else if(strlen(num1)-1 < strlen(num2)-1) { r = sub_p(num1+1,num2); for(unsigned int i=0;i<strlen(r);i++) { result[i] = r[i]; } result[strlen(r)] = '\0'; } else if(strcmp(num1+1,num2)) { r = sub_p(num1+1,num2); result[0] = '-'; for(unsigned int i=0;i<strlen(r);i++) { result[i+1] = r[i]; } result[strlen(r)+1] = '\0'; } else { r = sub_p(num1+1,num2); for(unsigned int i=0;i<strlen(r);i++) { result[i] = r[i]; } result[strlen(r)] = '\0'; } } } int main() { char a[33] = "-9876543210"; char b[33] = "-9876543209"; char result[33]; add(a,b,result); printf("%s\n",result); return 0; }
这个题在下面能做出来,考试的时候就怕时间不够。。。。