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