第十五节 机试题之大整数加法运算

来源:互联网 发布:cmd怎么测试端口 编辑:程序博客网 时间:2024/06/02 01:58
第十五节  机试题之大整数加法运算

所接触的数据类型中,int数据类型、float数据类型等都有范围,如果超出这个范围,则无法表达,更不能进行数学中的运算。但是字符串的长度却不受限制,但是要让字符串进行数学运算也就解决了大整数的运算。
这样的话,可以联想到小学的竖式加减乘除的方法,逐位相加减。
大整数的加法算法:
/****************************************************************
**  函数名称:BigNumberAdd
**  函数功能:大整数的加法运算
**  入口参数:str1:第一个加数
              str2:第二个加数
             ptr:容纳两数之和的空间首地址
             ptrSize:此空间大小
**  出口参数:
****************************************************************/
int BigNumberAdd(const char *str1, const char *str2,
char *ptr, int ptrSize)
{
    /*
    **  iStr1Len:存储第一个字符串
    **  iStr2Len:存储第二个字符串
    **  iMaxLen  两个字符串中最长的长度
    **  ij      循环
    **  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] ;
       /* 如果character1character2不是数字,则退出 */
       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 = '\0' ;
    /* 将数字逆序输出 */
    for ( j = 0 ; j < --i ; j++) {
       char cTemp  = ptr[j] ;
            ptr[j] = ptr ;
            ptr = cTemp  ;
    }
    return 1 ;
}
大整数的减法、乘法、除法运算都可依据小学的竖式运算方法。测试结果:
数据一:987654321123456789
数据二:123456789987654321
两数相加之和:1111111111111111110
两数相加之差:864197531135802468
两数相加之积:120408474453741807546258192212924859
请按任意键继续. . .

原创粉丝点击