高精度小数加算
11176 ワード
高精度小数加算
ラベル(スペース区切り):アルゴリズムコンテストの高精度
原題はHDU 1753.当時はこのような問題が高精度演算とは知らず、大数の演算だと思っていたので、大数の四則演算を「大数家族桶」と名付けて、今考えても楽しかったです.
ネット上でこの問題がJavaで書くことを見て、分を分けて問題に署名して、みんなは見てみることができて、私のここは書いていません.
明らかに高位小数加算で、doubleではできません.それはシミュレーション配列の加算しかできません.次は私が書いた答えです.小数点以下の小数点と整数点を分離したコードを関数に書こうとすると、プログラムのコミットは常に過ぎず、やむを得ず、同じ関数に書きます.正解は以下の通りです.
私がネット上で探しているC言語の実現コードはすべてとても長くて、百行を過ぎて、私が書いたこの最短だと思っています.また、私が書いた関数を設定するコードもあります.なぜ間違っているのか分かりませんが、貼ってください.
上记のコードの运行は问题ありませんが、提出するとWAになります.私もなぜか分かりません.
ラベル(スペース区切り):アルゴリズムコンテストの高精度
原題はHDU 1753.当時はこのような問題が高精度演算とは知らず、大数の演算だと思っていたので、大数の四則演算を「大数家族桶」と名付けて、今考えても楽しかったです.
ネット上でこの問題がJavaで書くことを見て、分を分けて問題に署名して、みんなは見てみることができて、私のここは書いていません.
Problem Description
, , , “ ”。
100 “ ” , 。
, A B, A+B 。
Input
, 。
400 A B。
Output
A+B , 。 Sample Output。
Sample Input
1.1 2.9
1.1111111111 2.3444323343
1 1.1
Sample Output
4
3.4555434454
2.1
明らかに高位小数加算で、doubleではできません.それはシミュレーション配列の加算しかできません.次は私が書いた答えです.小数点以下の小数点と整数点を分離したコードを関数に書こうとすると、プログラムのコミットは常に過ぎず、やむを得ず、同じ関数に書きます.正解は以下の通りです.
#include
#include
#define N 401
int a[N]={0},b[N]={0},c[N]={0},d[N]={0};
int main()
{
char str1[N],str2[N];
while (scanf("%s %s",str1,str2)!=EOF)
{
int i,j,k;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
int len1=strlen(str1),len2=strlen(str2);
for (i=0;str1[i]!='.'&&i0;
for (j=i+1;j//
a[k++]=str1[j]-'0';
k=0;
for (j=i-1;j>=0;j--) //
b[k++]=str1[j]-'0';
k=0;
for (i=0;str2[i]!='.'&&ifor (j=i+1;j//
c[k++]=str2[j]-'0';
k=0;
for (j=i-1;j>=0;j--) //
d[k++]=str2[j]-'0';
k=0;
for (i=N;i>=0;i--) //
{
a[i]+=c[i];
if (i!=0&&a[i]>9)
{
a[i]%=10;
a[i-1]++;
}
else if (i==0&&a[i]>9)
{
a[i]%=10;
b[0]++;
}
}
for (i=0;i//
{
b[i]+=d[i];
if (b[i]>9)
{
b[i]%=10;
b[i+1]++;
}
}
for (i=N;i>=0&&b[i]==0;i--); //
for (j=i;j>=0;j--)
printf("%d",b[j]);
for (i=N;i>=0&&a[i]==0;i--); //
if (i>=0)
{
printf(".");
for (j=0;j<=i;j++)
{
printf("%d",a[j]);
}
}
printf("
");
}
return 0;
}
私がネット上で探しているC言語の実現コードはすべてとても長くて、百行を過ぎて、私が書いたこの最短だと思っています.また、私が書いた関数を設定するコードもあります.なぜ間違っているのか分かりませんが、貼ってください.
#include
#include
#define N 401
int f=0;
int a[N],b[N],c[N],d[N];
void store(char str[N],int decimal[N],int integer[N])
{
int i,j,k=0;
int len = strlen(str);
for (i=0;iif (str[i]=='.')
{
f=1;
break;
}
}
for (j=i+1;j'0';
k=0;
for (j=i-1;j>=0;j--)
integer[k++]=str[j]-'0';
}
int main()
{
char str1[N],str2[N];
while (scanf("%s%s",str1,str2)!=EOF)
{
memset(a,0,N);
memset(b,0,N);
memset(c,0,N);
memset(d,0,N);
store(str1,a,b);
store(str2,c,d);
int i,j=0;
for (i=N;i>=0;i--)
{
a[i]+=c[i];
if (i!=0&&a[i]>=10)
{
a[i]-=10;
a[i-1]++;
}
if (i==0&&a[i]>=10)
{
a[i]-=10;
b[0]++;
}
}
for (i=0;iif (b[i]<=0)
{
break;
}
else if (b[i]>=10)
{
b[i]-=10;
b[i+1]++;
}
}
for (i=N;i>=0;i--)
{
if (b[i]!=0)
j=1;
if (j)
printf("%d",b[i]);
}
if (!j)
printf("0");
for (i=N;i>=0;i--)
if (a[i])
break;
if (i>-1)
printf(".");
if (i>=0)
for (j=0;j<=i;j++)
printf("%d",a[j]);
printf("
");
}
return 0;
}
上记のコードの运行は问题ありませんが、提出するとWAになります.私もなぜか分かりません.