有点问题,因为你没有给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
}