您的位置:首页 > 其它

九度1137解题报告

2014-02-28 13:30 169 查看
大神们说没有更简单的方法,于是还是用模拟加法。题目如下

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: