第十五节 机试题之大整数加法运算
所接触的数据类型中,int数据类型、float数据类型等都有范围,如果超出这个范围,则无法表达,更不能进行数学中的运算。但是字符串的长度却不受限制,但是要让字符串进行数学运算也就解决了大整数的运算。 这样的话,可以联想到小学的竖式加减乘除的方法,逐位相加减。 大整数的加法算法: /**************************************************************** ** 函数名称:BigNumberAdd ** 函数功能:大整数的加法运算 ** 入口参数:str1:第一个加数 str2:第二个加数 ptr:容纳两数之和的空间首地址 ptrSize:此空间大小 ** 出口参数: ****************************************************************/ int BigNumberAdd(const char *str1, const char *str2, char *ptr, int ptrSize) { /* ** iStr1Len:存储第一个字符串 ** iStr2Len:存储第二个字符串 ** iMaxLen : 两个字符串中最长的长度 ** i、j : 循环 ** iCarry : 进位标志位 */ int iStr1Len , iStr2Len , iMaxLen , i , j , iCarry = 0 ; char character1 , character2 ; /* 测量两个字符串长度¨¨ */ iStr1Len = strlen(str1) ; iStr2Len = strlen(str2) ; /* 将ptr存储区域的数据全部清零 */ memset(ptr, 0, ptrSize) ; /* 得到两个加数中最大的长度¨¨ */ iMaxLen = iStr1Len > iStr2Len ? iStr1Len : iStr2Len ; /* 从低位向高位逐位相加 */ for ( i = 0 ; i < iMaxLen ; i++ ) { character1 = (iStr1Len - 1 - i) < 0 ? '0' : str1[iStr1Len - 1 - i] ; character2 = (iStr2Len - 1 - i) < 0 ? '0' : str2[iStr2Len - 1 - i] ; /* 如果character1和character2不是数字,则退出 */ if ( (!isdigit(character1)) || (!isdigit(character2)) ) { return 0 ; } /* 模仿竖式逐位相加 */ iCarry += (character1 - '0') + (character2 - '0') ; assert(i < ptrSize) ; /* 保存当前位数据 */ ptr = iCarry % 10 + '0' ; /* 保存进位数据 */ iCarry /= 10 ; } /* 如果最高位出现进位,则增加一位 */ if (0 != iCarry) { assert(i < ptrSize) ; ptr[i++] = iCarry + '0' ; } assert(i < ptrSize) ; ptr = ' |