大数相加

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


void shuru(int*,int*,int*,int*);
void shuruxs(int * ,int* );
void nixu(int *,int );
void jiaohuan(int * ,int *);
void xjiazs(int * ,int *,int *,int ,int ,int* );
void xjiaxs(int *,int *,int ,int *,int ,int*,int*);
void jinweizs(int *,int *);
void jinweixs(int *,int *,int*);
void shuchuzs(int *,int ,int );
void shuchuxs(int *,int );




int main(void) 
{
	int s_z0[100]={0},wsz0=0;
	int s_x0[100]={0},wsx0=0;
	int s_z1[100]={0},wsz1=0;
	int s_x1[100]={0},wsx1=0;
	int s_hez[101]={0},wshez=0;
	int s_hex[100]={0},wshex=0;
	
	shuru(s_z0,s_x0,&wsz0,&wsx0);
	shuru(s_z1,s_x1,&wsz1,&wsx1);
	
	
	xjiazs( s_z0,s_z1,s_hez,wsz0, wsz1, &wshez);
	xjiaxs(s_x0,s_x1,wsx0,s_hex,wsx1,&wshex,s_hez);
	
	shuchuzs(s_hez,wshez,wshex);
	shuchuxs(s_hex,wshex);
	
	return 0;
}


void shuru(int *s_z0,int *s_x0,int *p_wsz0,int *p_wsx0)
{
 char c;
 while((c = getchar()) != '.' && c != '\n')
 {
  s_z0[*p_wsz0] = c-'0';
  (*p_wsz0)++;
 }
 nixu(s_z0,*p_wsz0);
 if(c=='.')
 {
  shuruxs(s_x0,p_wsx0);
 }
}


void shuruxs(int s[],int* p_ws)
{
 char c;
 while(c = getchar(),c != '\n' )
 {
  s[*p_ws] = c-'0';
  (*p_ws)++;
 }
}



void nixu(int *s_z,int ws)
{
 int low=0;
 int high=ws-1;
 while(high>low)
 {
 jiaohuan(s_z+high,s_z+low);
 high--;
 low++;
 }
}

void jiaohuan(int *a ,int *b)
{
 int temp;
 temp=*a;
 *a=*b;
 *b=temp;
}

void xjiazs(int * s_z0,int *s_z1,int *s_hez,int wsz0,int wsz1,int* p_wshez)
{
  *p_wshez=wsz0>wsz1?wsz0:wsz1;
  int i;
  for(i=0;i<*p_wshez;i++)
  {
   s_hez[i]=s_z0[i]+s_z1[i];
  }
  jinweizs(s_hez,p_wshez);

}

void xjiaxs(int *s_x0,int *s_x1,int wsx0,int *s_hex,int wsx1,int* p_wshex,int *s_hez)
{
 *p_wshex=wsx0>wsx1?wsx0:wsx1;
  int i;
  for(i=0;i<*p_wshex;i++)
  {
   s_hex[i]=s_x0[i]+s_x1[i];
  }
  jinweixs(s_hex,p_wshex,s_hez);
}

void jinweizs(int *s_he,int *p_ws)
{
  int i;
  for(i=0;i<*p_ws;i++)
  {
    s_he[i+1]+=s_he[i]/10;
    s_he[i]%=10;
  }
  *p_ws+=s_he[*p_ws]!=0; 
}

void jinweixs(int*s_hex,int *p_wsx,int*s_hez)
{
  int i;
  for(i=*p_wsx-2;i>=0;i--)
  {
    s_hex[i]+=s_hex[i+1]/10;
    s_hex[i+1]%=10;
  }
  if(s_hex[0]>9)
  {
   s_hez[0]++;
   s_hex[0]%=10;
  }
}



void shuchuzs(int *s_hez,int ws,int wsx)
{
  int i;
  for(i=ws-1;i>=0;i--)
  {
   printf("%d",s_hez[i]);
  }
  printf("%s",wsx==0?" ":".");
}

void shuchuxs(int *s_hex,int ws)
{
 int i;
 for(i=0;i<ws;i++)
 {
 printf("%d",s_hex[i]);
 }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值