HDU 1753 大明A+B

#include <stdio.h>
#include <string.h>

#define   Expand(a,b) for(i=0; i<b;i++) strcat(a->num,"0");  a->dec+=b;//这里要注意
char s1[1000],s2[1000],ans[1000];

typedef struct{ char num[1000]; int dec;}Real; //考验结构 Real相当于struct {} 记住声明变量要带struct
Real r1,r2,r3;

int max(int a,int b)  {return a>b?a:b;}

void load(char s[],Real *real)
{
   int i,j=0,c;
   for (i=0,c=-1;s[i];i++)
	   if (s[i]=='.')  c++;
	   else
	   {
		   real->num[j++]=s[i];
		   if(c!=-1) c++;
	   }
	   real->num[j]='\0';
	   real->dec=max(c,0);
       if(real->num[0]=='\0')  strcpy(real->num,"0");
}

void add(char a[],char b[],char c[])
{
    int len1=strlen(a), len2=strlen(b), len=max(len1,len2);
	int i,j,k,aa,bb,cc=0;//这个cc=0  错误找了好久啊 
	c[len+1]='\0';
	for ( i=len1-1,j=len2-1,k=len; i>=0||j>=0 ;i--,j--,k--)//不能int=len1-1 等等
	{
        aa=(i<0? 0:a[i]-'0');//常考这个字符串与数字的转换
		bb=(j<0? 0:b[j]-'0');
		c[k]=(aa+bb+cc)%10+'0';//同上
		cc=(aa+bb+cc)/10;
	}
	if(cc !=0) c[0]=cc+'0';
	else  strcpy(c,c+1);
}
void Realadd(Real *a,Real *b,Real *c)
{
	int i;
    if(a->dec < b->dec)  { Expand(a,b->dec-a->dec);}
    if(a->dec > b->dec)  { Expand(b,a->dec-b->dec);}//这里要加大括号 因为是一个for循环加一个语句,否则可能不执行
	c->dec=a->dec;
	add(a->num,b->num,c->num);
}
void Set(Real *a,char s[])
{
    int len1=a->dec,len=strlen(a->num),i,j;
    for (i=0,j=-1;i<len-len1;i++)
    {
		if(a->num[i] !='0'&&j==-1)  j=0;//  00001.1 这种情况要注意
		if(j!=-1) s[j++]=a->num[i];
    }
	if(j==-1)  j=0,s[j++]='0';
	s[j++]='.';
	for(i=len-a->dec;i<len;i++)
           s[j++]=a->num[i];
	s[j]='\0';
	while(s[--j]=='0')  s[j]='\0';
	if(s[j]=='.')  s[j]='\0';
}
int main()
{
    while (~scanf("%s %s",s1,s2))
    {
		load(s1,&r1); load(s2,&r2);
		Realadd(&r1,&r2,&r3);
		Set(&r3,ans);
		puts(ans);
    }
	return 0;
}

你可能感兴趣的:(HDU 1753 大明A+B)