BigNumCalculator

好久没写日志了,

其实草稿写了不少,

无论是感悟还是技术,

到最后却总是删掉,

总是觉得少了一股劲, 

总越来越觉得自己还不够透彻。。。 

 

上周时候,偶然同事讨论起了大数运算,

想起来自己以前做过一个BigNumCalculator 的阶乘计算器,

代码半天没找着,

打回家让老妈开了qq远程控制家里的电脑,

 良久,才在一个很深的目录找到了代码,

忽然自己惊讶了,目录里还有很多自己过往写的代码,

从Web,各种DCC工具的练习,C++, DX。。。

 好久未有这般感慨了,往日的一幕幕,浮现在眼前,

大学伊始,不准带电脑,

试过图书馆阅览室站一个早上看技术书,

然后破解一台角落处查书用的电脑,

然后站一个下午用记事本写代码,

像JS之类的就直接用IE测试, 

抑或厚着脸皮买了鞋套,偷偷混进机房,

搞得几位机房的老师都认得我了; 

有半年断网,

咬咬牙,买了一个NB的8G优盘,

然后在图书馆机房充值,

每周末去一次性准备好自己想看的资料,

然后回寝室慢慢啃。 

现在想想挺酸楚的, 

可仔细回想当时充满勇气和努力的自己,

我100%确定我当时是开心的,毫无保留地付出的, 

反观今日的自己,物质上有了很大的充实,

同时也背负起了一些沉重遥远的现实目标, 

更多的时候,自己开始计较了。。。

 

这一切是我想要的么?

庆幸,

我现在还能找到当时的代码,

以及尚存的勇气和热血,

毋须多言, 

翻开青涩的代码,

留下一个有趣的注释标头,

卯足劲,

一切从头开始, 

明天还有好远,

继续,努力! 


  1  /*
  2  091111
  3  大数阶乘运算
  4  节日快乐
  5  -----Zephyr
  6  */
  7  /*
  8      基本思路,化而治之
  9      123456789
 10      *      211
 11      ---------
 12      123456789
 13    +1234567890
 14   +24691357800
 15   ------------
 16   =26049382479
 17       */
 18 #include <iostream>
 19 #include <stdio.h>
 20 #include <windows.h>
 21 #include <assert.h>
 22 #include <conio.h>
 23 
 24  #pragma comment(lib,"winmm.lib")
 25  using  namespace std;
 26  const  int MaxLength= 128;
 27  const  int Max=MaxLength- 1;
 28 
 29  void Copy( int *des, int *src)
 30 {    
 31      for( int j=Max;j>= 0;j--)
 32     {
 33         des[j]=src[j];
 34     }
 35 }
 36 
 37  void Zero( int *src)
 38 {    
 39      for( int j= 0;j<MaxLength;j++)
 40     {
 41         src[j]= 0;
 42     }
 43 }
 44 
 45  int GetLength( int *a)
 46 {
 47      int i=Max;
 48      while( a[i] <=  0 && i>  0 )
 49         --i;
 50      return ++i;
 51 }
 52 
 53  void Increase( int *a1)
 54 {
 55     a1[Max]++;
 56      for( int j=Max;j> 0;j--)
 57     {
 58          if(a1[j]> 10)
 59         {
 60             a1[j]-= 10;
 61             a1[j- 1]++;
 62         }
 63          else 
 64              break;
 65     }
 66 }
 67 
 68  // 相加的时候向前提了k个位置
 69  void Sum( int *sum, int * a, int k= 0)
 70 {
 71      int j2;
 72      // 有漏洞,但可以把Max设大
 73       for( int j= 0 ;j < GetLength(a) ;++j)
 74     {
 75         j2= j+k;
 76         sum[ j2 ]+=a[j];
 77          // 加法最大值应该只有 8+8 == 19
 78           if(sum[ j2 ] >=  10)
 79         {
 80              if( j2 >= MaxLength )
 81                 assert( " Over flow! ");
 82              if( sum[ j2 ]< 0 || sum[ j2 ] >  19 )
 83                 assert( " Oh no ");
 84             sum[j2]-= 10;
 85              if(sum[j2]>= 10)
 86                 sum[j2]= 0;
 87             sum[j2+ 1]++;
 88         }
 89     }
 90 }
 91 
 92  void Multi( int *sum, int *aO, int k) // 十进制乘法
 93  {
 94      if( k< 0 || k>  9 )
 95         assert( " Wrong Number ");
 96      // a0*k送入结果sum中
 97       int t= 0;
 98      // 不能改变a0
 99      Copy(sum,aO);
100      int j;
101      for( j= 0 ; j < GetLength(aO) ; ++j )
102     {
103         sum[j]*=k;
104          if(t)
105         {
106             sum[j]+=t;
107             t= 0;
108         }
109          // 进位
110           if(sum[j] >=  10)
111         {
112             t=sum[j]/ 10;
113             sum[j]=sum[j]% 10;
114         }
115     }
116      // 最后一位还可能会进位
117       if(t)
118     {
119         sum[j]+=t;
120     }
121 }
122 
123  void MultiX( int *total, int *t) // 大数相乘
124  {
125      int temp[MaxLength];
126      int tempSum[MaxLength];
127     Zero( tempSum );
128      for( int j= 0; j<GetLength( t ) ;++j)
129     {
130         Multi(temp,total,t[j]);
131         Sum(tempSum,temp,j);
132     }
133     Copy(total,tempSum);
134 }
135 
136  void AnotherWay( int n)
137 {
138      // 精确到12!看来你也不行哈。。。-_-!
139       // 寻址问题
140      SIZE_T x= 1;
141      int i= 1;
142      while(i<=n)
143     {
144         x*=i;
145         i++;
146     }
147     cout<< " K.O: "<<endl<<x<<endl;
148      /* x=479001600;
149      x*=13;
150      cout<<x; */
151 }
152 
153  void main0()
154 {
155      int total[MaxLength],t[MaxLength];    
156      int n;
157      float t1= 0;
158      bool debug= 0;
159     cout<< " 输入阶乘级数: "<<endl;
160     cin>>n;
161      while(n> 0)
162     {
163         t1=( float)timeGetTime();
164         Zero(total);Zero(t);
165         total[Max]=t[Max]= 1;
166         AnotherWay(n);
167         n--;
168          int i= 2;
169          while(n> 0) // 阶乘,从1*2*3*...*n
170          {
171             Increase(t);
172             MultiX(total,t);
173              if(debug)
174             {
175                 cout<< " "<<i++<< " 层: "<<endl; // DeBug使用,i既是当前乘数
176                   for( int j=MaxLength-GetLength(total);j<MaxLength;j++)
177                     cout<<total[j];
178                 cout<<endl;
179             }
180             n--;
181         }
182         cout<< " 结果为: "<<endl;
183          for( int j=MaxLength-GetLength(total);j<MaxLength;j++) // 从不为零的数位开始输出结果
184              cout<<total[j];
185         cout<<endl<< " 用时: "<<( float)timeGetTime()-t1<< " ms "<<endl;
186         cout<< " -----------Over-------------- "<<endl;
187         cout<< " 输入阶乘级数(0结束): "<<endl;
188         cin>>n;
189     }
190 } 
191 
192  void GetABigNumber( int InVec[] )
193 {
194      int n;
195      int i= 0;
196      char c; 
197      // cin>>n;
198       // cin.get(c);
199      c=getch();
200     n=atoi(&c);
201      while ( n>=  0 && n <  10 )
202     {
203          if( i >  0)
204         {
205              int i1=i;
206              while( i1 >  0)
207             {
208                 InVec[ i1 ]=InVec[i1- 1];
209                 --i1;
210             }
211         }
212         InVec[ 0]=n;
213         ++i;
214         c=getch();
215         n=atoi(&c);
216     }
217 }
218  void PraseString2BigNumber( int inVec[], char Srt[])
219 {
220      int length = strlen( Srt );
221     Zero(inVec);
222      char ch;
223      for ( int i=length- 1, j= 0;j<length;++j)
224     {
225         ch=Srt[i--];
226         inVec[ j ]=atoi( &ch );
227     }
228 }
229  void main()
230 {
231     unsigned  int p1= 10;
232     unsigned  int p2= 0xa0000000;
233      float pw=p2/p1;
234      int total[MaxLength],t[MaxLength];    
235      int n;
236      float t1= 0;
237      bool debug= 0;
238      /*
239      Zero(total);
240      Zero(t);
241      cout<<"输入第一个大数:"<<endl;
242      GetABigNumber(total);
243      cout<<"输入第二个大数:"<<endl;
244      GetABigNumber(t);
245       */
246      // char str1[]="12888";
247       // char str2[]="12888";
248       // 16384
249       char str1[]= " 145682565648569854785693568458967890 ";
250      char str2[]= " 64318641564154513745146843514 ";
251     PraseString2BigNumber(total,str1);
252     PraseString2BigNumber(t,str2);
253     cout<< " 第一个大数: "<<str1<<endl;
254     cout<< " 乘以第二个大数: "<<str2<<endl;
255     t1=( float)timeGetTime();
256     MultiX(total,t);
257     cout<< " 结果为: "<<endl;
258      for( int j=GetLength(total)- 1 ;j>= 0;--j) // 从不为零的数位开始输出结果
259          cout<<total[j];
260     cout<<endl<< " 用时: "<<( float)timeGetTime()-t1<< " ms "<<endl;
261     cout<< " -----------Over-------------- "<<endl;
262     cin>>n;
263 } 

你可能感兴趣的:(BigNumCalculator)