任意长度的正小数的加法 求助
任意长度的正小数的加法给你两个正的小数A和B,你的任务是计算出A+B的值
输入
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B
输出
请在一行里面输出输出A+B的值,请输出最简形式。
样例输入
1.1 2.9
1.1111111111 2.3444323343
1 1.1
样例输出
4
3.4555434454
2.1
我想着想着就把自己绕晕了 有没有简洁的代码可以参考一下
程序代码:#include <stdio.h>
#include <string.h>
void bar( const char* restrict s, char p[restrict static 1000] )
{
size_t len = strlen( s );
const char* dot = strchr( s, '.' );
memset( p, '0', 1000 );
p[499] = '.';
p[999] = '\0';
memcpy( dot?p+499-(dot-s):p+499-len, s, len );
}
void foo( const char* a, const char* b )
{
char a_[1000], b_[1000], c_[1000];
bar( a, a_ );
bar( b, b_ );
bar( "", c_ );
// 相加
unsigned carry = 0;
for( size_t i=998; i!=0; --i )
{
if( i != 499 )
{
carry += a_[i]-'0' + b_[i]-'0';
c_[i] = carry%10 + '0';
carry /= 10;
}
}
// 去除尾部的零
{
size_t i;
for( i=998; c_[i]=='0'; --i );
c_[i+(c_[i]!='.')] = '\0';
}
// 去除首部的零
char* p = c_ + strspn(c_,"0");
p -= (*p=='.');
puts( p );
}
int main( void )
{
for( char a[401],b[401]; scanf("%s%s",a,b)==2; )
foo( a, b );
}