⑴ c语言的高精度加法
若确定答案正确,那就是不符合时间限制,存储限制或没有作适当的错误处理!
请详细描述原始问题。
⑵ 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);
}
⑶ c语言求高精度小数
//改了部分代码
#include<stdio.h>
#include<math.h>
#defineN200//小数位数,方便调试
intmain(){
intm,n;
inti;
intj=0;
scanf("%d/%d",&m,&n);
if(m*n<0){//处理一下正负号:如果结果是负数时
printf("-");//先输出负号
m=abs(m);//后面运算过程全部用正数来运算
n=abs(n);
}
printf("%d.",m/n);
m=m%n;
for(i=1;i<=N;i++){
if(m==0){//能整除时
printf("0");
continue;
}
j=10*m/n;
printf("%d",j);
m=10*m%n;
}
printf(" ");
return0;
}
⑷ c语言如何运用数组做高精度的开方运算,要求精确到小数点后100位
#include<stdio.h>
#include<string.h>
intl;
intwork(into,char*O,intI)
{
charc,*D=O;
if(o>0)
{
for(l=0;D[l];D[l++]-=10)
{
D[l++]-=120;
D[l]-=110;
while(!work(0,O,l))
D[l]+=20;
putchar((D[l]+1032)/20);
}
putchar(10);
}
else
{
c=o+(D[I]+82)%10-(I>l/2)*(D[I-l+I]+72)/10-9;
D[I]+=I<0?0:!(o=work(c/10,O,I-1))*((c+999)%10-(D[I]+92)%10);
}
returno;
}
intmain()
{
chars[1200];s[0]='0';
scanf("%s",s+1);
if(strlen(s)%2==1)
work(2,s+1,0);
else
work(2,s,0);
return0;
}
⑸ 对于高精度小数的操作(C语言)
// 小数的高精度表示。
#include<stdio.h>
#include<math.h>
#include<string.h>
constintMAXLEN=500;
intChange(charmantissa[],intdenominator,intnumerator=1){
intremainder,i=0,n,t,sign;
chardigit;
if(denominator==0){
strcpy(mantissa,"#IN");
printf("%d/%d:分母为零,转换失败! ",numerator,denominator);
return0;
}
if(numerator==0){
strcpy(mantissa,"0.0");
return1;
}
sign=(numerator*denominator<0)?-1:1;
t=abs(numerator/denominator);
numerator=abs(numerator);
denominator=abs(denominator);
if(t==0){//整数部分为零
if(sign==-1){//整数部分为零的负实数
strcpy(mantissa,"-0.");
i+=3;
}
else{//整数部分为零的正实数
strcpy(mantissa,"0.");
i+=2;
}
}
else{//整数部分不为零的实数
while(t>0){
mantissa[i++]=t%10+'0';
t/=10;
}
if(sign==-1)mantissa[i++]='-';
for(n=0;n<i/2;++n){
digit=mantissa[n];
mantissa[n]=mantissa[i-1-n];
mantissa[i-1-n]=digit;
}
mantissa[i++]='.';
}
remainder=numerator%denominator;
while(i<MAXLEN&&remainder){
remainder*=10;
while(i<MAXLEN&&remainder<denominator){
remainder*=10;
mantissa[i++]='0';
}
if(i==MAXLEN)break;
t=remainder/denominator;
mantissa[i++]=t+'0';
remainder-=t*denominator;
}
mantissa[i]='