算法提高 实数相加

问题描述
  计算两个实数相加的结果。
  输入的实数满足如下要求: (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
#include
using 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<



你可能感兴趣的:(算法提高 实数相加)