高精度算法-带小数大数相加

晚上写了两个小时,想出了AC的一种方法

写的有点复杂

附原题:

问题 A: 大小数相加(字符串+指针)

时间限制: 1 Sec  内存限制: 128 MB
提交: 310  解决: 166
[提交][状态][讨论版]

题目描述

给你两个正的小数A和B,你的任务是计算出A+B的值。

输入

本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

输出

请在一行里面输出输出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 }

 

posted @ 2013-12-15 00:05  Jeremy Wu  阅读(900)  评论(0编辑  收藏  举报