C语言计算高精度加法

Python012

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<iostream>

using namespace std

class big

{

public:

big()

{

high=1

num[0]=1

int n

for(n=1n<40n++)

{

num[n]=0

}

}

big(int hi)

{

high=hi-1

num[0]=1

int n

for(n=1n<40n++)

{

num[n]=0

}

}

bool operator >(big &b2)

big operator +(big &b2)

big operator -(big &b2)

big operator *(big &b2)

void output()

void input()

big muln(int a)

private:

long num[40]

int high

}

bool big::operator >(big &b2)

{

if(high>b2.high)return true

if(high<b2.high)return false

else

{

int i

for(i=highi>=0i--)

if(num[i]>b2.num[i])return true

return false

}

}

big big::operator +(big &b2)

{

int maxhigh

maxhigh=(high>b2.high)?high:b2.high

big b(maxhigh+1)

int i

for(i=maxhighi>=0i--)

b.num[i]=num[i]+b2.num[i]

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

{

if(b.num[i]/10!=0)

{

b.num[i+1]+=b.num[i]/10

b.num[i]=b.num[i]%10

if(b.high<i+1)

b.high=i+1

}

}

return b

}

big big::operator -(big &b2)

{

big b

int i

if(*this>b2)

{

b.high=high

for(i=highi>=0i--)

b.num[i]=num[i]-b2.num[i]

for(i=0i<=b.highi++)

{

if(b.num[i]<0)

{

b.num[i+1]--

b.num[i]=b.num[i]+10

}

}

if(b.num[high]==0)

b.high--

}

if(b2>*this)

{

b.high=b2.high

for(i=highi>=0i--)

b.num[i]=b2.num[i]-num[i]

for(i=0i<=b.highi++)

{

if(b.num[i]<0)

{

b.num[i+1]--

b.num[i]=b.num[i]+10

}

}

if(b.num[high]==0)

b.high--

b.num[high]=-b.num[high]

}

return b

}

big big::operator *(big &b2)

{

big b(high+b2.high),c(high+b2.high)

int i

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

{

int n

c=b2.muln(num[i])

for(n=1n<=in++)

c=c.muln(10)

b=b+c

}

b.num[0]--

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

{

if(b.num[i]/10!=0)

{

b.num[i+1]+=b.num[i]/10

b.num[i]=b.num[i]%10

if(b.high<i+1)

b.high=i+1

}

}

return b

}

big big::muln(int a)

{

int i

big b

b.high=high

for(i=0i<=b.highi++)

b.num[i]=num[i]*a

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

{

if(b.num[i]/10!=0)

{

b.num[i+1]+=b.num[i]/10

b.num[i]=b.num[i]%10

if(b.high<i+1)

b.high=i+1

}

}

return b

}

void big::output()

{

int i

for(i=highi>=0i--)

cout<<num[i]

}

void big::input()

{

int i

char chr[40]

for(i=highi>=0i--)

{

cin>>chr[i]

num[i]=chr[i]-'0'

}

}

int main()

{

int n1,n2

char c='y',*c1,*c2

while(c=='y'||c=='Y')

{

cout<<"输入第一个大数位数:"

cin>>n1

big b1(n1)

cout<<endl<<"输入第一个大数:"<<endl

b1.input()

cout<<"选择操作:"<<endl<<"1.加法"<<endl<<"2.减法"<<endl<<"3.乘法"<<endl

int choice

cin>>choice

cout<<"输入第二个大数位数:"

cin>>n2

big b2(n2)

cout<<endl<<"输入第二个大数:"<<endl

b2.input()

big b3

switch(choice)

{

case 1:b3=b1+b2break

case 2:b3=b1-b2break

case 3:b3=b1*b2break

}

b3.output()

cout<<endl<<"再来一次?Y(是)/ N(否)"<<endl

cin>>c

}

system("pause")

return 0

}