例题:将十进制转化为二进制。(输入的数不大于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还要做一次处理。没有它的那么更进一步,那么精巧。

 

收获:代码只是实现,具体的思想是数学。数学设计的好,程序才能好。