c语言 算法提高 实数相加,算法提高 实数相加

问题描述

计算两个实数相加的结果。

输入的实数满足如下要求: (1)  小数点前的整数部分最多100位,(2) 小数点后的小数部分最多100位.

输入格式

两行字符串,每行都是一个合法的实数。合法的意思是指:  整数部分的值如果大于零,则最高位数字必定大于零. 如果整数部分的值为零,则整数部分只有一个零. 小数部分尾部可以有任意多的零. 可以没有小数部分,  此时也没有小数点. 如果有小数点, 则至少需要有一位小数部分, 且允许是零.

输出格式

相加结果。注意: 小数部分末尾如果有连续的0, 则它们都是有效数字,  不能舍去. 如果是两个整数相加, 则结果仍为整数而没有小数部分.

样例输入

样例一:

0.0000000000000000000000000000000000000111111111000000000000000000

100000000000000000000000000000000000000000000000000000.0

样例二:

3

4

样例三:

3.9

2

样例四:

1.001

8.99999999999999999999999

样例输出

样例一:

100000000000000000000000000000000000000000000000000000.0000000000000000000000000000000000000111111111000000000000000000

样例二:

7

样例三:

5.9

样例四:

10.00099999999999999999999 以为很简单,结果花了很长时间,而且代码也特别的不好,这种大数题目,就随着自己心意去模拟就好,还要够细心

代码:

#include#include#include#includeusing namespace std;

char a[210]={0},b[210]={0},c[210]={0},flag;

int main()

{

char t1[210]={0},t2[210]={0};

int cc=0,i,j,x=0,y=0,lena,lenb,len,lent1,lent2;

/*FILE *fp;

fp = fopen("c://lanqiao.txt","r");

fscanf(fp,"%s",a);

fscanf(fp,"%s",b);

fclose(fp);

puts(a);

puts(b);*/

gets(a);

gets(b);

for (i=0; ilent2 ? len = lent1 : len =lent2;

for (i = len-1; i>0; i--)

{

if (t1[i] == 0)

t1[i] = '0';

if (t2[i] == 0)

t2[i] = '0';

c[cc] += t1[i]-'0' + (t2[i]-'0');

if (c[cc] >= 10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

}

if (c[cc] == 1)

{

c[cc+1] = 1;

}

c[cc] = '.'; //小数点位置

cc++;

for (i=x-1,j=y-1; i>=0&&j>=0; i--,j--)

{

c[cc] += a[i]-'0' + (b[j]-'0');

if (c[cc] >= 10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

}

while (i != -1)//a数组还有没计算完

{

c[cc] += a[i] -'0';

if (c[cc] >= 10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

i--;

}

while (j != -1)

{

c[cc] += b[j] - '0';

if (c[cc] >= 10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

j--;

}

if (c[cc]==0) //没有进位

cc--;

for (i=cc; i>=0; i--)

{

if (c[i] != '.')

c[i] += '0';

cout<=0&&j>=0; i--,j--)

{

c[cc] += a[i]-'0' +(b[i]-'0');

if (c[cc] >=10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

}

while (i != -1)//a数组还有没计算完

{

c[cc] += a[i] -'0';

if (c[cc] >= 10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

i--;

}

while (j != -1)

{

c[cc] += b[j] - '0';

if (c[cc] >= 10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

j--;

}

if (c[cc] == 0)

cc--;

for (i=cc; i>=0; i--)

{

if (c[i] != '.')

c[i] += '0';

cout<=0&&j>=0; i--,j--)

{

c[cc] += a[i]-'0' +(b[i]-'0');

if (c[cc] >=10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

}

while (i != -1)//a数组还有没计算完

{

c[cc] += a[i] -'0';

if (c[cc] >= 10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

i--;

}

while (j != -1)

{

c[cc] += b[j] - '0';

if (c[cc] >= 10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

j--;

}

strcpy(t1,t1+x);

printf("%s",t1);

}

else

{

strcpy(t1,b);

b[y] = '\0';

lena = strlen(a);

lenb = strlen(b);

for (i= lena-1,j = lenb -1; i>=0&&j>=0; i--,j--)

{

c[cc] += a[i]-'0' +(b[j]-'0');

if (c[cc] >=10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

}

while (i != -1)//a数组还有没计算完

{

c[cc] += a[i] -'0';

if (c[cc] >= 10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

i--;

}

while (j != -1)

{

c[cc] += b[j] - '0';

if (c[cc] >= 10)

{

c[cc] %= 10;

c[cc+1] = 1;

}

cc++;

j--;

}

}

if (c[cc] == 0)

cc--;

for (i=cc; i>=0; i--)

{

if (c[i] != '.')

c[i] += '0';

cout<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值