#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; }