C语言计算高精度加法

Python013

C语言计算高精度加法,第1张

if(n==1)

有点问题,因为你没有给n赋初值,所以n的值不确定,也就是说可能为1,那该if语句就失效了。

另外,其实根本就没必要事先比较s1和s2的长度,模仿递增向量的合并方法,先计算长度相同的部分,之后计算剩余部分。

我用c++的string字符串写了一个,你参考下。

#include<iostream>

#include<string>

using

namespace

std

void

Reverse(string

&

str)

void

AddInt(string

&

c,

string

a,

string

b)

int

main()

{

string

a,

b,

c

cin

>>

a

>>

b

AddInt(c,

a,

b)

cout

<<

a

<<

"

+

"

cout

<<

b

<<

"

=

"

<<

endl

cout

<<

c

<<

endl

system("pause")

return

0

}

void

Reverse(string

&

str)

{

int

left,

right

left

=

0

right

=

str.size()-1

while

(left

<

right)

{

char

ch

=

str[left]

str[left]

=

str[right]

str[right]

=

ch

left++

right--

}

}

void

AddInt(string

&

c,

string

a,

string

b)//模仿递增向量的合并方法

{

c.resize(0)

Reverse(a)

Reverse(b)

//逆序计算a+b,则从低位开始计算

int

i,

carry

i

=

carry

=

0

while

(i

<

a.size()

&&

i

<

b.size())

{

c

+=

(a[i]-'0'

+

b[i]-'0'

+

carry)

%

10

+

'0'

carry

=

(a[i]-'0'

+

b[i]-'0'

+

carry)

/

10

i++

}

while

(i

<

a.size())

{

c

+=

(a[i]-'0'

+

carry)

%

10

+

'0'

carry

=

(a[i]-'0'

+

carry)

/

10

i++

}

while

(i

<

b.size())

{

c

+=

(b[i]-'0'

+

carry)

%

10

+

'0'

carry

=

(b[i]-'0'

+

carry)

/

10

i++

}

while

(carry

>

0)//计算进位部分

{

c

+=

carry

%

10

+

'0'

carry

/=

10

}

i

=

c.size()

-

1

while

(c[i]

==

'0')//消除多余的高位0

{

i--

}

c

=

c.substr(0,

i+1)

Reverse(c)

}

#include <stdio.h>

#include <string.h>

#include <malloc.h>

const int MAXSIZE = 200 + 1

// 完成以字符串形式的两个大数相加。返回字符串形式的和。

// tatol ← addnum1 + addnum2

char *LargeNumberAdd(char const *addnum1,char const *addnum2, char *total) {

int i,j,k = 0,len,result,carry = 0

int len1 = strlen(addnum1)

int len2 = strlen(addnum2)

for(i = len1 - 1,j = len2 - 1 i >= 0 && j >= 0 --i,--j) {

result = addnum1[i] - '0' + addnum2[j] - '0' + carry

carry = result/10

total[k++] = result%10 + '0'

}

while(i >= 0) {

result = addnum1[i--] - '0' + carry

carry = result/10

total[k++] = result%10 + '0'

}

while(j >= 0) {

result = addnum2[j--] - '0' + carry

carry = result/10

total[k++] = result%10 + '0'

}

total[k] = '\0'

len = strlen(total)

for(i = 0 i < len/2 ++i) {

k = total[i]

total[i] = total[len - 1 - i]

total[len - 1 - i] = k

}

return total

}

// 完成以字符串形式的两个大数相减。返回字符串形式的差。

// difference ← subnum1 - subnum2

char *LargeNumberSub(char *subnum1,char *subnum2, char *difference) {

int i,j,k,result,borrow = 0

int sign = 0,swap = 0

char *pta,*ptb

int len1 = strlen(subnum1)

int len2 = strlen(subnum2)

if(len1 == len2) {

for(i = 0 i < len1 ++i) {

if(subnum1[i] < subnum2[i]) {

swap = 1

break

}

}

}

if(len2 > len1 || swap == 1) {

pta = (char *)malloc((len2 + 1)*sizeof(char))

ptb = (char *)malloc((len1 + 1)*sizeof(char))

strcpy(pta,subnum2)

strcpy(ptb,subnum1)

k = len1

len1 = len2

len2 = k

sign = 1

}

else {

pta = (char *)malloc((len1 + 1)*sizeof(char))

ptb = (char *)malloc((len2 + 1)*sizeof(char))

strcpy(pta,subnum1)

strcpy(ptb,subnum2)

}

for(i = len1 - 1,j = len2 - 1,k = 0 i >= 0 && j >= 0 --i,--j) {

result = pta[i] - ptb[j] - borrow

if(result < 0) {

result += 10

borrow = 1

}

else borrow = 0

difference[k++] = result + '0'

}

while(i >= 0) {

result = pta[i] - '0' - borrow

if(result < 0) {

result += 10

borrow = 1

}

else borrow = 0

--i

difference[k++] = result + '0'

}

if(sign) difference[k++] = '-'

difference[k] = '\0'

for(i = 0 i < k/2 ++i) {

result = difference[i]

difference[i] = difference[k - 1 - i]

difference[k - 1 - i] = result

}

free(pta)

free(ptb)

return difference

}

int main() {

char s[MAXSIZE] = "1234567"

char t[MAXSIZE] = "87086543"

char result[MAXSIZE + 1]

printf("%s + %s = %s\n",s,t,LargeNumberAdd(s,t,result))

printf("%s - %s = %s\n",s,t,LargeNumberSub(s,t,result))

return 0

}