例題:將十進制轉化為二進制。(輸入的數不大於10000)
program demicalToBinary; type arrayType=array[1..14] of integer; var arr:arrayType; k,n,modNum,i,flag,highest:integer; begin readln(k); n:=1; while k>=2 do begin { writeln('this is in loop,status:k:',k,' n:',n); } modNum:=k mod 2; k:=k div 2; arr[n]:=modNum; n:=n+1; end; { writeln('now loop over,status:k:',k,' n:',n); } if k=1 then arr[n]:=1; flag:=0; for i:=14 downto 1 do if arr[i]=1 then begin flag:=1; highest:=i; break; end; for i:=highest downto 1 do write(arr[i]); end.
上面是我寫的代碼。
寫代碼時的收獲是
把人腦當計算機,人工去執行一遍過程。就能感覺到步驟都很簡單,一步一步的執行出來。
計算機也是這樣執行的,只是它很快,一下就執行好了罷了。
代碼改進:大括號里是注釋掉的代碼
Version2:
program demicalToBinary; type arrayType=array[1..14] of integer; var arr:arrayType; k,n,modNum,i,flag,highest:integer; begin readln(k); n:=1; { while k>=2 do } while k<>0 do begin { writeln('this is in loop,status:k:',k,' n:',n); } modNum:=k mod 2; k:=k div 2; arr[n]:=modNum; n:=n+1; end; { writeln('now loop over,status:k:',k,' n:',n); } { if k=1 then arr[n]:=1; } { flag:=0; for i:=14 downto 1 do if arr[i]=1 then begin flag:=1; highest:=i; break; end; for i:=highest downto 1 do write(arr[i]); } for i:=n-1 downto 1 do write(arr[i]); end.
版本2的代碼,其實是做了兩點
第一點是最高位的值,在開始賦值時就可以知道。不用再去求一遍。這里參考答案的代碼確實想的更好。
第二點是最開始賦值的終止條件,不等於0。如果等於0的話,就結束了。而我當時想的條件是最后的值為1,對1還要做一次處理。沒有它的那么更進一步,那么精巧。
收獲:代碼只是實現,具體的思想是數學。數學設計的好,程序才能好。