您的位置:首页 > 其它

Hdu 1753 大明A+B <高精度小数相加>

2012-08-07 00:00 399 查看
[b]题意:[/b]

很长很长的小数相加..

[b]思路:[/b]

用1000长的数组处理两个小数..前500存整数..后500存小数..然后相应位相加..

然后输出除去前导0和后面0的..

[b]Tips:[/b]

※ strchr(char *a, char c) 返回的是 a 字符数组中 c 字符的第一次出现的位置..返回的不是迭代器的位置..而是地址..

※ 主要就是对字符串的处理..要很小心阿..

※ 以字符数组的形式读入高精度小数..然后用他们 - ‘0’..把字符变成整数来处理..最后以整数方式输出..

[b]Code:[/b]

View Code

#include <stdio.h>
#include <cstring>
#define Max 1010
#define clr(x) memset(x, 0, sizeof(x))

char str1[Max], str2[Max], ans[Max];
char tmp1[Max], tmp2[Max];

void Calculate()
{
int i, j, k;
clr(tmp1), clr(tmp2), clr(ans);

int len = strlen(str1);
if(strchr(str1, '.') == NULL)
k = len;
else
k = strchr(str1, '.') - str1;///--->>!!!
for(i = k-1, j = 500; i >= 0; --i, ++j)
tmp1[j] = str1[i]-'0';
for(i = k+1, j = 499; i < len; ++i, --j)
tmp1[j] = str1[i]-'0';

len = strlen(str2);
if(strchr(str2, '.') == NULL)
k = len;
else
k = strchr(str2, '.') - str2;
for(i = k-1, j = 500; i >= 0; --i, ++j)
tmp2[j] = str2[i] - '0';
for(i = k+1, j = 499; i < len; ++i, --j)
tmp2[j] = str2[i] - '0';

int tmpc = 0, tmps;
for(i = 0; i < 1010; ++i){
tmps = tmp1[i]+tmp2[i]+tmpc;
ans[i] = tmps%10;
tmpc = tmps/10;
}
}

void outPut()
{
int i, j;
for(i = 1009; i > 500; --i)
if(ans[i]) break;
while(i >= 500)
printf("%d", ans[i--]);
for(j = 0; j < 500; ++j)
if(ans[j]) break;
if(j != 500){
printf(".");
for(i = 499; i >= j; --i)
printf("%d", ans[i]);
}
puts("");
}

int main()
{
int i, j, k;
while(scanf("%s %s", &str1, &str2) != EOF)
{
Calculate();
outPut();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: