晚上寫了兩個小時,想出了AC的一種方法php
寫的有點複雜數組
附原題:測試
問題 A: 大小數相加(字符串+指針)ui
時間限制: 1 Sec 內存限制: 128 MB
提交: 310 解決: 166
[提交][狀態][討論版]spa
題目描述指針
給你兩個正的小數A和B,你的任務是計算出A+B的值。code
輸入blog
本題目包含多組測試數據,請處理到文件結束。
每一組測試數據在一行裏面包含兩個長度不大於400的正小數A和B。內存
輸出ci
請在一行裏面輸出輸出A+B的值,請輸出最簡形式。詳細要求請見Sample Output。
樣例輸入
1.1 2.9
1.1111111111 2.3444323343
1 1.1
樣例輸出
4
3.4555434454
2.1
附代碼:
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 void fun(char a[],char b[]); 6 void func(char aa[]); 7 void funb(char ab[]); 8 char a[200],b[200]; 9 char aa[100],ab[100],ba[100],bb[100]; 10 char res[200]; 11 int i,j,len,ui; 12 while(scanf("%s%s",a,b)!=EOF) 13 { 14 len=strlen(a); 15 for(i=0;i<len;i++) 16 if(a[i]=='.') 17 break; 18 19 if(i==len) 20 { 21 strcpy(aa,a); 22 aa[i]='\0'; 23 ab[0]='0'; 24 ab[1]='\0'; 25 } 26 else 27 { 28 strncpy(aa,a,i++); 29 aa[i-1]='\0'; 30 strncpy(ab,a+i,len-i); 31 ab[len-i]='\0'; 32 } 33 34 len=strlen(b); 35 for(i=0;i<len;i++) 36 if(b[i]=='.') 37 break; 38 39 if(i==len) 40 { 41 strcpy(ba,b); 42 ba[i]='\0'; 43 bb[0]='0'; 44 bb[1]='\0'; 45 } 46 else 47 { 48 strncpy(ba,b,i++); 49 ba[i-1]='\0'; 50 strncpy(bb,b+i,len-i); 51 bb[len-i]='\0'; 52 } 53 54 ui=strlen(ab); 55 if(strlen(bb)>ui) 56 ui=strlen(bb); 57 58 fun(ab,bb);//將計算結果存在ab數組中 59 // printf("ab=%s\n",ab); 60 fun(aa,ba);//將計算結果存在aa數組中 61 // printf("aa=%s\n",aa); 62 i=strlen(ab);j=strlen(aa); 63 if(strlen(ab)!=ui) 64 { 65 if(aa[j-1]=='9') 66 { 67 func(aa); 68 } 69 else 70 aa[j-1]++; 71 // printf("aa=%s\n",aa); 72 strncpy(res,aa,strlen(aa)); 73 res[strlen(aa)]='.'; 74 funb(ab); 75 strncpy(res+strlen(aa)+1,ab,i-1); 76 res[strlen(aa)+i]='\0'; 77 // printf("res=%s\n",res); 78 } 79 else 80 { 81 strncpy(res,aa,j); 82 res[j]='.'; 83 strncpy(res+j+1,ab,i); 84 res[i+j+1]='\0'; 85 //printf("%s\n",res); 86 } 87 len=strlen(res); 88 // printf("len=%d\n",len); 89 for(i=0;i<len;i++) 90 if(res[i]=='.') 91 break; 92 ui=len; 93 for(j=len-1;j>=i;j--) 94 { 95 if(res[j]=='0') 96 ui--; 97 else 98 break; 99 } 100 len=ui; 101 102 if(res[len-1]=='.') 103 len--; 104 res[len]='\0'; 105 printf("%s\n",res); 106 } 107 return 0; 108 } 109 void fun(char a[],char b[]) 110 { 111 char c[150],tmp; 112 int i,j,x,y,z,jinw=0,ci=0; 113 i=strlen(a)-1; 114 j=strlen(b)-1; 115 while( i>=0 || j>=0 ) 116 { 117 if(i<0) //當a數組被加完時 118 x=0; 119 else 120 x=a[i]-'0'; 121 if(j<0) //當b數組被加完時 122 y=0; 123 else 124 y=b[j]-'0'; 125 126 z=x+y; 127 if(jinw) //若是有進位 128 z++; 129 if(z>9) //考慮當前數累加是否會致使下次計算進位 130 { 131 jinw=1; 132 z-=10; 133 } 134 else 135 jinw=0; 136 c[ci++]=z+'0'; 137 i--; 138 j--; 139 } 140 if(jinw) //考慮最後一位是否還有進位 141 c[ci++]='1'; 142 c[ci]='\0'; //爲C數組添加終止符 143 for(i=0;i<ci/2;i++) 144 { 145 tmp=c[i];c[i]=c[ci-i-1];c[ci-i-1]=tmp; 146 } 147 strncpy(a,c,ci); 148 a[ci]='\0'; 149 return ; 150 } 151 void func(char aa[]) 152 { 153 char c[50],tmp; 154 int i,x,z,jinw=1,ci=0; 155 i=strlen(aa)-1; 156 while( i>=0 ) 157 { 158 x=aa[i]-'0'; 159 160 z=x; 161 if(jinw) //若是有進位 162 z++; 163 if(z>9) //考慮當前數累加是否會致使下次計算進位 164 { 165 jinw=1; 166 z-=10; 167 } 168 else 169 jinw=0; 170 c[ci++]=z+'0'; 171 i--; 172 } 173 if(jinw) //考慮最後一位是否還有進位 174 c[ci++]='1'; 175 c[ci]='\0'; //爲C數組添加終止符 176 for(i=0;i<ci/2;i++) 177 { 178 tmp=c[i];c[i]=c[ci-i-1];c[ci-i-1]=tmp; 179 } 180 strcpy(aa,c); 181 aa[ci]='\0'; 182 return ; 183 } 184 void funb(char ab[]) 185 { 186 int i,len; 187 len=strlen(ab); 188 for(i=0;i<len-1;i++) 189 ab[i]=ab[i+1]; 190 ab[len-1]='\0'; 191 return ; 192 }