晚上写了两个小时,想出了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 }