HDU 1753 大明A+B

来源:互联网 发布:tomcat修改端口 编辑:程序博客网 时间:2024/06/10 14:50
#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 {} 记住声明变量要带structReal 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;}

0 0
原创粉丝点击