例题:将十进制转化为二进制。(输入的数不大于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还要做一次处理。没有它的那么更进一步,那么精巧。
收获:代码只是实现,具体的思想是数学。数学设计的好,程序才能好。