好久没写日志了,
其实草稿写了不少,
无论是感悟还是技术,
到最后却总是删掉,
总是觉得少了一股劲,
总越来越觉得自己还不够透彻。。。
上周时候,偶然同事讨论起了大数运算,
想起来自己以前做过一个BigNumCalculator 的阶乘计算器,
代码半天没找着,
打回家让老妈开了qq远程控制家里的电脑,
良久,才在一个很深的目录找到了代码,
忽然自己惊讶了,目录里还有很多自己过往写的代码,
从Web,各种DCC工具的练习,C++, DX。。。
好久未有这般感慨了,往日的一幕幕,浮现在眼前,
大学伊始,不准带电脑,
试过图书馆阅览室站一个早上看技术书,
然后破解一台角落处查书用的电脑,
然后站一个下午用记事本写代码,
像JS之类的就直接用IE测试,
抑或厚着脸皮买了鞋套,偷偷混进机房,
搞得几位机房的老师都认得我了;
有半年断网,
咬咬牙,买了一个NB的8G优盘,
然后在图书馆机房充值,
每周末去一次性准备好自己想看的资料,
然后回寝室慢慢啃。
现在想想挺酸楚的,
可仔细回想当时充满勇气和努力的自己,
我100%确定我当时是开心的,毫无保留地付出的,
反观今日的自己,物质上有了很大的充实,
同时也背负起了一些沉重遥远的现实目标,更多的时候,自己开始计较了。。。
这一切是我想要的么?
庆幸,
我现在还能找到当时的代码,
以及尚存的勇气和热血,
毋须多言,
翻开青涩的代码,
留下一个有趣的注释标头,
卯足劲,
一切从头开始,
明天还有好远,
继续,努力!
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 }