大神們說沒有更簡單的方法,於是還是用模擬加法。題目如下
http://ac.jobdu.com/problem.php?pid=1137
計算機裏的浮點數加法,是先對階,相加,然後規格化,類似地,在模擬的時候,我們也要對階,即將輸入的數分成小數部分和整數部分,然後相加,將結果輸出。我將輸入當做字符串處理,先超出兩個數的小數點的位置,然後將小數部分對齊,即在較短的小數部分後面補零,然後相加,記下進位,再將整數部分對齊,不齊的高位補零,然後相加,記得算上小數的進位,以及去掉小數部分的末尾零,最後輸出。代碼如下:
#include <stdio.h>
#include <string.h>
char s1[101],s2[101];
int a[101],b[101],ans_d[101],ans_i[101];
int main()
{
int n;
scanf("%d",&n);
while (n--)
{
scanf("%s %s",s1,s2);
int alen=strlen(s1), blen=strlen(s2);
int ap,bp;
for (int i=0;i<alen;++i) //求小數點的位置
if (s1[i]=='.') ap=i;
for (int i=0;i<blen;++i)
if (s2[i]=='.') bp=i;
int ansp_len,asize=0,bsize=0;
if (alen-ap>blen-bp) //將小數部分對齊
{
ansp_len=alen-1-ap;
for (int i=0;i<alen-ap-(blen-bp);++i)
b[bsize++]=0;
}
else
{
ansp_len=blen-1-bp;
for (int i=0;i<blen-bp-(alen-ap);++i)
a[asize++]=0;
}
for (int i=alen-1;i>ap;--i)
a[asize++]=s1[i]-'0';
for (int i=blen-1;i>bp;--i)
b[bsize++]=s2[i]-'0';
int carry=0,temp;
for (int i=0;i<ansp_len;++i) //小數部分相加
{
temp=a[i]+b[i]+carry;
ans_d[i]=temp%10;
carry=temp/10;
}
int intlen;
asize=bsize=0;
for (int i=ap-1;i>=0;--i) //整數部分對齊
a[asize++]=s1[i]-'0';
for (int i=bp-1;i>=0;--i)
b[bsize++]=s2[i]-'0';
if (ap>bp)
{
intlen=ap;
for (int i=0;i<ap-bp;++i)
b[bsize++]=0;
}
else
{
intlen=bp;
for (int i=0;i<bp-ap;++i)
a[asize++]=0;
}
for (int i=0;i<intlen;++i) //整數部分相加
{
temp=a[i]+b[i]+carry;
ans_i[i]=temp%10;
carry=temp/10;
}
if (carry!=0) ans_i[intlen++]=carry;
for (int i=intlen-1;i>=0;--i)
printf("%d",ans_i[i]);
printf(".");
int end=0;
while (ans_d[end]==0) ++end; //小數部分去尾零
for (int i=ansp_len-1;i>=end;--i)
printf("%d",ans_d[i]);
printf("\n");
}
return 0;
}