hdu 1753 大数相加(高精度)
2016-09-22 22:54
429 查看
C - 大明A+B
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d
& %I64u
Submit Status
Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
Sample Input
Sample Output
思路:这个题我是将两个数的小数部分和整数部分分开相加然后在输出的,但是此题有几个需要注意地方:
1.小数点后多余的0不能输出,
2.第一位小数的进位是要加在整数部分上的(这个比较容易被忽略)
我对小数进位的处理方法是:小数部分的第一位从数组的1开始存,然后进位存在下标为0的数组里,不管有没有进位直接将a[0]直接加到 整数部分的第一位这样比较方便处理
ac 代码:
#include<stdio.h>
#include<string.h>
int a[510],b[510],c[510],d[510];
char s1[510],s2[510];
int main()
{ int i,j,n1,n2,t1,t2,num1,num2,k;
while(scanf("%s%s",s1,s2)!=EOF)
{ t1=n1=strlen(s1);
t2=n2=strlen(s2);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
for(i=0;i<n1;i++)
{ if(s1[i]=='.')
{ t1=i;
break;
}
}
k=0;
for(i=t1-1;i>=0;i--)
a[k++]=s1[i]-'0';
for(i=0;i<n2;i++)
{
if(s2[i]=='.')
{t2=i;
break;
}
}
k=0;
for(i=t2-1;i>=0;i--)
b[k++]=s2[i]-'0';
k=1;
if(t1+1<n1)
for(i=t1+1;i<n1;i++)
c[k++]=s1[i]-'0';
k=1;
if(t2+1<n2)
for(i=t2+1;i<n2;i++)
d[k++]=s2[i]-'0';
num1=(n1-t1)>(n2-t2)?(n1-t1):(n2-t2);
for(i=num1;i>=1;i--)
{ c[i]+=d[i];
if(c[i]>=10)
{ c[i-1]++;
c[i]-=10;
}
}
a[0]+=c[0];
num2=(t1-1)>(t2-1)?(t1-1):(t2-1);
for(i=0;i<=num2;i++)
{ a[i]+=b[i];
if(a[i]>=10)
{ a[i+1]++;
a[i]-=10;
}
}
if(a[num2+1]>0)
printf("%d",a[num2+1]);
for(i=num2;i>=0;i--)
printf("%d",a[i]);
for(i=num1;i>=1;i--)
{ if(c[i]==0)
continue;
else
break;
}
if(i==0);
else
{ printf(".");
for(j=1;j<=i;j++)
printf("%d",c[j]);
}
printf("\n");
}
return 0;
}
hdu 1753
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d
& %I64u
Submit Status
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.45554344542.1
思路:这个题我是将两个数的小数部分和整数部分分开相加然后在输出的,但是此题有几个需要注意地方:
1.小数点后多余的0不能输出,
2.第一位小数的进位是要加在整数部分上的(这个比较容易被忽略)
我对小数进位的处理方法是:小数部分的第一位从数组的1开始存,然后进位存在下标为0的数组里,不管有没有进位直接将a[0]直接加到 整数部分的第一位这样比较方便处理
ac 代码:
#include<stdio.h>
#include<string.h>
int a[510],b[510],c[510],d[510];
char s1[510],s2[510];
int main()
{ int i,j,n1,n2,t1,t2,num1,num2,k;
while(scanf("%s%s",s1,s2)!=EOF)
{ t1=n1=strlen(s1);
t2=n2=strlen(s2);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
for(i=0;i<n1;i++)
{ if(s1[i]=='.')
{ t1=i;
break;
}
}
k=0;
for(i=t1-1;i>=0;i--)
a[k++]=s1[i]-'0';
for(i=0;i<n2;i++)
{
if(s2[i]=='.')
{t2=i;
break;
}
}
k=0;
for(i=t2-1;i>=0;i--)
b[k++]=s2[i]-'0';
k=1;
if(t1+1<n1)
for(i=t1+1;i<n1;i++)
c[k++]=s1[i]-'0';
k=1;
if(t2+1<n2)
for(i=t2+1;i<n2;i++)
d[k++]=s2[i]-'0';
num1=(n1-t1)>(n2-t2)?(n1-t1):(n2-t2);
for(i=num1;i>=1;i--)
{ c[i]+=d[i];
if(c[i]>=10)
{ c[i-1]++;
c[i]-=10;
}
}
a[0]+=c[0];
num2=(t1-1)>(t2-1)?(t1-1):(t2-1);
for(i=0;i<=num2;i++)
{ a[i]+=b[i];
if(a[i]>=10)
{ a[i+1]++;
a[i]-=10;
}
}
if(a[num2+1]>0)
printf("%d",a[num2+1]);
for(i=num2;i>=0;i--)
printf("%d",a[i]);
for(i=num1;i>=1;i--)
{ if(c[i]==0)
continue;
else
break;
}
if(i==0);
else
{ printf(".");
for(j=1;j<=i;j++)
printf("%d",c[j]);
}
printf("\n");
}
return 0;
}
hdu 1753
相关文章推荐
- hdu_1002 大数相加----高精度问题
- hdu1753 大明A+B (java大数练习第二弹 高精度小数)
- HDU-1753 大明A+B【大数相加】
- HDU 1753 大明A+B(大数相加)(string::npos)
- HDU-1753 大明A+B【大数相加】
- HDU 1753 小数的大数相加
- hdu 1753 高精度小数相加
- Hdu 1753 大明A+B <高精度小数相加>
- HDU A + B Problem II(高精度大数相加)(java版)
- HDU 1047.Integer Inquiry【多个大数相加】【高精度】【8月25】
- HDU1002 大数相加
- hdu 1753 坑爹的高精度
- HDU 1002 A + B Problem II 【大数相加】(3.16)
- hdu1002大数相加
- hdu 1002 A + B Problem II 大数相加
- hdu--1002 大数相加 (连起来相加很容易,分开为啥错了?)
- hdu 1753 大明A+B (java大数)
- hdu 1753(大数——加法)
- HDU 1047 Integer Inquiry 多个大数相加
- [HDU](1753)大明A+B ---大数