任意长度的正小数的加法 求助
任意长度的正小数的加法给你两个正的小数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 ); }