键盘上的舞者

My Email: marckywu@gmail.com
随笔 - 19, 文章 - 0, 评论 - 3, 引用 - 0
数据加载中……

超大整数的加法运算

       所谓超大数就是int, 甚至long int等数据类型无法直接对其存储的整数。对于这种超大数的加法运算,我的解决方案是:
       首先将输入的大数转化为字符串存储起来,这样一来,字符串的首字符就对应着大数的最高位,末字符就对应大数的最低位。
       然后,从两个字符串的末尾开始取出一个字符,将其转化为一个一位整数后进行相加(这里相加的时候还需要加上进位标志的值),这样将产生两种情况:
              一、相加后大于等于10,需要进1位。
              二、相加后小于10,不需要进位。
       待对两个字符串中的所有位字符都处理完成后,就得到了一个相加的结果字符串,这个结果字符串的不足之处是按低位到高位的顺序排列的。所以还得对其高低位的对应字符进行交换处理,从而得出正确的结果和字符串。。。

大数相加的函数C代码如下:
/*
 *功能:addBigNum函数的功能为对两个大数进行相加运算。
 *参数:pa, pb指向需要相加的两个大数的字符串表示。
 *          psum指向的缓冲区用来存储相加的结果和的字符串表示。
 *返回值:无
 
*/
void addBigNum(char *pa, char *pb, char *psum)
{
    
int indexa, indexb, index;
    
int sum, addone;

    addone 
= 0//向高位进一标志
    index = 0;  //psum的位置索引

    
//indexa, indexb分别索引到字符串stra, strb的最后一个字符
    indexa = strlen(pa) - 1;
    indexb 
= strlen(pb) - 1;
    
    
for ( ; indexa >= 0 || indexb >= 0; indexa--, indexb--) {
        
//处理字符串长度不同的运算
        if (indexa >= 0 && indexb >= 0) { 
            sum 
= (pa[indexa] - '0'+ (pb[indexb] - '0'+ addone;
        } 
else if (indexa >= 0 && indexb < 0) {
            sum 
= (pa[indexa] - '0'+ addone;
        } 
else if (indexa < 0 && indexb >= 0) {
            sum 
= (pb[indexb] - '0'+ addone;
        }
        
        
if (sum >= 10) {
            
//两个一位数组相加最多向高位进1
            psum[index++= sum - 10 + '0';
            addone 
= 1;
        } 
else {
            psum[index
++= sum + '0';
            addone 
= 0;
        }
    }

    psum[index] 
= '\0';
    swapStr(psum);
    
    
return;
}

void swapStr(char *str)
{
    
//对str指向的字符串中的字符进行逆向重排.
    int len, i;
    
char temp;

    len 
= strlen(str);
    
    
for (i = 0; i < len / 2; i++) {
        temp 
= str[i];
        str[i] 
= str[len - i - 1];
        str[len 
- i - 1= temp;
    }
}


posted on 2009-06-30 16:02 Marcky 阅读(921) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理