C语言计算高精度加法

#include"stdio.h"#include"string.h"main(){intt,i,n;chars1[80],s2[80],s3[80];gets(s1);... #include "stdio.h"
#include "string.h"
main()
{ int t,i,n;
char s1[80],s2[80],s3[80];
gets(s1);
gets(s2);
strrev(s1);
strrev(s2);
if(strlen(s2)>strlen(s1))
{t=strlen(s1);n=1;}
else t=strlen(s2);
for(i=0;i<t;i++)
{if((s1[i]-'0')+(s2[i]-'0')>=10)
{s3[i]=((s1[i]-'0')+(s2[i]-'0'))%10+'0';
if(n==1)
s2[i+1]=s2[i+1]+1;
else s1[i+1]=s1[i+1]+1;
}
else s3[i]=((s1[i]-'0')+(s2[i]-'0'))+'0';
}
for(i=t;n==1,i<strlen(s2);i++)
s3[i]=s2[i];
for(i=t;n!=1,i<strlen(s1);i++)
s3[i]=s1[i];
strrev(s3);
puts(s3);
}怎样帮我改一下就能实现加法?
展开
 我来答
邹寄竹帅茶
2019-04-07 · TA获得超过3.7万个赞
知道小有建树答主
回答量:1.2万
采纳率:28%
帮助的人:1109万
展开全部
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);
}
goal000011
2008-11-28 · TA获得超过196个赞
知道答主
回答量:135
采纳率:0%
帮助的人:0
展开全部
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);
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
粟濯仝名姝
2019-05-07 · TA获得超过3712个赞
知道小有建树答主
回答量:3109
采纳率:32%
帮助的人:204万
展开全部
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);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
泠月冰辰
2008-11-28 · TA获得超过981个赞
知道小有建树答主
回答量:1149
采纳率:0%
帮助的人:816万
展开全部
呵呵,正巧,我和我朋友这几天也在实现此类算法,我只实现了+ *,正在实现-法,除法还没搞好。。。
我朋友貌似全部都OK了。。
我看你用的算法和我朋友用的差不多,和我的相差比较大。
额。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式