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);
}怎样帮我改一下就能实现加法? 展开
#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);
}怎样帮我改一下就能实现加法? 展开
4个回答
展开全部
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);
}
有点问题,因为你没有给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);
}
展开全部
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);
}
有点问题,因为你没有给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);
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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);
}
有点问题,因为你没有给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);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
呵呵,正巧,我和我朋友这几天也在实现此类算法,我只实现了+ *,正在实现-法,除法还没搞好。。。
我朋友貌似全部都OK了。。
我看你用的算法和我朋友用的差不多,和我的相差比较大。
额。。。
我朋友貌似全部都OK了。。
我看你用的算法和我朋友用的差不多,和我的相差比较大。
额。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询