任意长度的正小数的加法 求助
任意长度的正小数的加法给你两个正的小数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
我想着想着就把自己绕晕了 有没有简洁的代码可以参考一下
2020-01-06 18:56
程序代码:#include<stdio.h>
int main()
{
int i=0,n;
float a,b,sum[100];
printf("请输入数据组数:");
scanf("%d",&n);
printf("请输入数据:\n");
for(i=0;i<n;i++)
{
scanf("%f %f",&a,&b);
sum[i]=a+b;
}
for(i=0;i<n;i++)
printf("%f\n",sum[i]);
return 0;
}

2020-01-06 19:16
2020-01-07 08:59
2020-01-07 09:46
程序代码:#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 );
}
2020-01-07 11:08
2020-01-07 21:44
2020-01-08 09:37
2020-01-08 09:38
[此贴子已经被作者于2020-1-8 19:41编辑过]
2020-01-08 17:01
[此贴子已经被作者于2020-1-8 17:51编辑过]

2020-01-08 17:12