c语言 大数相加

Python035

c语言 大数相加,第1张

c/c++中int和unsigned类型变量,都不能保存超过10位的整数,但有时我们需要计算位数非常长的整数或小数的加法。一般我们称这种基本数据类型无法表示的整数为大整数。如何表示和存放大整数呢?基本的思想就是:用数组存放和表示大整数。一个数组元素,存放大整数中的一位。

现在假如我们要计算俩个200位数的加法。显然,任何C/C++固有类型的变量都无法保存它。最直观的想法是可以用一个字符串来保存它。字符串本质上就是一个字符数组,因此为了编程更方便,我们也可以用数组int an[200]来保存一个200 位的整数,让an[0]存放个位数,an[1]存放十位数,an[2]存放百位数……那么如何实现两个大整数相加呢?方法很简单,就是模拟小学生列竖式做加法,从个位开始逐位相加,超过或达到10 则进位。也就是说,用int an1[201]保存第一个数,用int an2[200]表示第二个数,然后逐位相加,相加的结果直接存放在an1 中。要注意处理进位。另外,an1 数组长度定为201,是因为两个200 位整数相加,结果可能会有201 位。实际编程时,不一定要费心思去把数组大小定得正好合适,稍微开大点也无所谓,以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。

下面是具体程序:

#include<stdio.h>

#include<string.h>

#defineMAX_LEN 200

int an1[MAX_LEN+10]

int an2[MAX_LEN+10]

charszLine1[MAX_LEN+10]

charszLine2[MAX_LEN+10]

int main(void)

{

    scanf("%s", szLine1)

    scanf("%s", szLine2)

    inti, j

    memset( an1, 0, sizeof(an1))

    memset( an2, 0, sizeof(an2))

int nLen1 = strlen( szLine1)

    for( j = 0, i = nLen1 - 1i >= 0  i--)

        an1[j++] = szLine1[i]- '0'

    int nLen2 = strlen(szLine2)

    for( j = 0, i = nLen2 - 1i >= 0  i--)

        an2[j++] = szLine2[i]- '0'

    for( i = 0i < MAX_LEN  i++ ) 

    { an1[i]+= an2[i]//逐位相加

        if( an1[i] >= 10 ) 

        { //看是否要进位

            an1[i] -= 10

            an1[i+1] ++ //进位

        }

    }

    for( i = MAX_LEN (i>= 0) && (an1[i] == 0) i-- ) 

    if(i>=0)

        for(  i >= 0 i--)

            printf("%d", an1[i])

    else     printf("0")

    return 0

}

#include<stdio.h>

#include<string.h>

//翻转

void *reverse(char str[])

{

int len =strlen(str)

char*ps,*pe,tmp

ps=str,pe=str+len-1

for( ps<peps++,pe--)

{

tmp=*ps

*ps=*pe

*pe=tmp//need *

}

return str//dont't forget return str

}

//相加,并ascii码变为相应的数字

void add(char a[],char b[])

{

char *pl,*ps

int i,la,lb,len

la=strlen(a)

lb=strlen(b)

(la>lb)?(pl=a,ps=b,len=lb):(pl=b,ps=a,len=la)

for(i=0 i<len i++)

{

pl[i] += ps[i]-96//96=2*'0'

//don't need *

}

len = (la>lb)?la:lb

for( i<leni++)

{

pl[i] -= 48//don't need *

}

for(i=0 i<len i++)

{

if(pl[i] >9)

{

pl[i+1]++

pl[i] %= 10

}

}

if(pl[len] != 0)

{

printf("%d",pl[len])

}

for(i=len-1 i>=0 i--)

{

printf("%d",pl[i])

}

}

int main()

{

char a[200],b[200]

scanf("%s%s",a,b)

add(reverse(a),reverse(b))

return 0

}