算法提高 实数相加

/* 问题描述
计算两个实数相加的结果。
输入的实数满足如下要求: (1) 小数点前的整数部分最多100位,(2) 小数点后的小数部分最多100位.
输入格式
两行字符串,每行都是一个合法的实数。合法的意思是指:
    整数部分的值如果大于零,则最高位数字必定大于零.
    如果整数部分的值为零,则整数部分只有一个零.
    小数部分尾部可以有任意多的零.
    可以没有小数部分,此时也没有小数点.
    如果有小数点, 则至少需要有一位小数部分, 且允许是零.
输出格式
相加结果。注意: 小数部分末尾如果有连续的0, 则它们都是有效数字, 不能舍去. 如果是两个整数相加, 则结果仍为整数而没有小数部分.
样例输入
样例一:
0.0000000000000000000000000000000000000111111111000000000000000000
100000000000000000000000000000000000000000000000000000.0
样例二:
3
4
样例三:
3.9
2
样例四:
1.00100000000000000000000
8.99999999999999999999999
样例输出
样例一:
100000000000000000000000000000000000000000000000000000.0000000000000000000000000000000000000111111111000000000000000000
样例二:
7
样例三:
5.9
样例四:
10.00099999999999999999999
0.0000000000000000000000000000000000000111111111000000000000000000
100000000000000000000000000000000000000000000000000000.01

 */

#include 
void shuru(int [], int [], int *, int*);
char sr_shu(int [] , int *);
void nixu( int [] , int );
void q_zshe(int [] , int , int [] , int , int [] , int * );
void q_xshe( int [] , int [] , int , int [] , int , int [] , int * );
void shuchu( int [] , int [] , int , int);
int main(void)
{
	int zs1[100]={0} , xs1[100]={0} , zsws1=0 ,xsws1=0;
	int zs2[100]={0} , xs2[100]={0} , zsws2=0 ,xsws2=0;
	shuru(zs1, xs1 , &zsws1 ,&xsws1);
	shuru(zs2, xs2 , &zsws2 ,&xsws2);
	int hezs[100]={0} , hexs[100]={0} , zsws3=0 ,xsws3=0;
	q_xshe(hezs, xs1 , xsws1 , xs2 , xsws2 , hexs , &xsws3);
	q_zshe(zs1 , zsws1 , zs2 , zsws2 , hezs , &zsws3);
	shuchu(hezs, hexs, xsws3 , zsws3 );
	return 0;
}
void shuchu( int zs[] , int xs[] , int xsws, int zsws)
{
	int i;
	for( i = zsws-1 ; i >=0 ; i--)
	{
		printf("%d",zs[i]);
	}
	if(xsws > 0 )
	{
		putchar('.');
		int i;
		for( i = 0 ; i < xsws ; i ++)
		{
			printf("%d",xs[i]);
		}
	}
	putchar('\n');
} 
void q_xshe(int zs[] ,int s1[] , int cd1, int s2[] , int cd2, int c[] , int * ws)
{
	int n=cd1 > cd2 ? cd1 : cd2;
	int i;
	for(i = 0 ; i < n ; i ++)
	{
		c[i]=s1[i]+s2[i];
	}
	for(i = n-1 ; i >0 ; i --)
	{
		c[i-1] += c[i]/10;
		c[i] %= 10;
		++ *ws;
	}
	if( n != 0)
	{
		++ *ws;
	}
	if(c[0] > 0)
	{
		zs[0] += c[0]/10;
		c[0] %= 10;
	}
} 
void q_zshe(int s1[] , int cd1, int s2[] , int cd2, int c[] , int * ws)
{
	int n=cd1 > cd2 ? cd1 : cd2;
	int i;
	for(i = 0 ; i < n ; i ++)
	{
		c[i]=c[i]+s1[i]+s2[i];
	}
	for(i = 0 ; i < n ; i ++)
	{
		c[i+1] += c[i]/10;
		c[i] %= 10;
		++ *ws;
	}
	if(c[n] > 0)
	{
		++ *ws;
	}
	
}
void nixu( int sz[] , int n)
{
	int tou=0 , wei = n-1;
	while(tou < wei)
	{
		int tmp=sz[tou];
		sz[tou]=sz[wei];
		sz[wei]=tmp;
		tou++;
		wei--;
	}
}
char sr_shu(int s[] , int * ws)
{
	char c;
	while((c = getchar()) != '.' && c != '\n' && c != EOF)
	{
		s[*ws] =  c - '0' ;
		++ *ws;
		
	}
	return c;
}
void shuru(int zs[], int xs[], int * zsws , int * xsws)
{
	if(sr_shu( zs , zsws) == '.')
	{
		sr_shu(xs , xsws);
	}
	nixu(zs , * zsws);
} 

 

你可能感兴趣的:(蓝桥杯)