不同进制数之间的转换及应用
在计算机领域中,有时需将不同进制之间进行转换,如十进制数转换成二进制数、八进制数和十六进制数等,以及进行逆转换。
不同进制数之间转换的基本算法:
1)十进制数(x)转换成任意进制数(n)的方法:将十进制数除以n进制反序取余。
2)将任意进制数转化程成十进制数方法:按权展开。
3)二进制数、八进制数、十六进制数之间的转换方法:利用三位二进制数表示一位八进制数,4位二进制数表示一位十六进制数的方法。
1、不同进制数的转换:
例1、将十进制数转换成任意进制数的(n<10)
program jinzhi1;
var a:array[1..50] of integer;
n,t,x,y,I:integer ;
begin
write(‘input number x,y:’);
read(x,y);t:=y;
writeln;
repeat
I:I+1;
A[I]:=y mod x;
Y:=y div x;
Until y=0;
For n:=I downto 1 do
Write(a[n]);
Writeln;
End.
输入:245 8
输出:365
如果超过十进制数,可以用字符A,B,C,D,E,F表示10—15的数,将余数在转换为字符类型进行处理。
例2、将任意进制整数转换成十进制数。、
program jinzhi2;
const m=20;
var str1:string ; str2:char;
n,I,l,y,t:integer ;
x:longint;{在数字输入时,可能超过5位数,如,100010001}
a:] of integer;
begin
writeln(‘input number x,n’);
readln(x,n);
str(x,str1);
l:=length(str1);
for I:=1 to l do
begin
str2:=str[I,];
a[I]:=ord(str2)-ord(‘0’);
end;
y:=1;t:=a[l];
for I:=l-1 downto 1 do
begin
if a[I]>n then begin
writeln(‘error’);
exit;
end;
y:=y*n;
t:=t+a[I]*y;
end;
writeln(x,’-----‘,t);
end.
当x=100110,n=2,输出:100110 (38)
4)将十进制小数转换为其他进制的数:将十进制小数乘以待转换的进制数正向取整的方法。程序自己实现(略)。
2、数的进制应用。
例1、用三进制数求解数学问题。
用质量为1g,3g,9g,21g,81g的砝码称物体的质量,最大可称121g。如果砝码允许放在天平的两边,编程输出秤不同物体时砝码应该怎样安排?例如m=14g时,m+9+3+1=27,即天平一端放m=14的物体和9g,3g,1g的砝码,另一端放27g的砝码。
Program tianpin;
Var a,b,c,d,e,m:integer;
Begin
For m:=1 to 121 do
For a:=-1 to 1 do
For b:=-1 to 1 do
For c:=-1 to 1 do
For d:=-1 to 1 do
For e:=-1 to 1 do
If m:=a*81 +b*27+c*9+d*3+e then
Begin
Writeln(m,’=’,a*81,’+’,b*27,’+’,c*9,’+’,d*3,’+’,e);
Readln;
End;
End.
例*2、走路问题:小明每天上学要从街口A到街口B,求他从街口A到街口B的向前路(不后退)一共有多少走法?应该怎样走?如下图:
B
图1
Program zoulu;
Const m=4;n=6;
Var t,p,x,I,j,k,a:integer;
Begin
T:=1;
P:=m+n;
For x:=1 to p-(m-1) do
For I:=x+1 to p-(m-2) do
For j:=I+1 to p-(m-3) do
For k:=j+1 to p-(m-4) do
Begin
Write('no:',t,'---');
For a:=1 to p do
If (a=x) or (a=I) or (a=j) or (a=k) then write(1:2) else write(0:2);
Writeln;
T:=t+1;
End;
Writeln('total=',t-1);
End.
例*3、将2^n个0和2^n个1排列成一圈。从任意一个位置开始,每次按逆时针的方向以长度为n+1的单位计数二进制数。要求给出一种排法,用上面的方法产生出2^(n+1)个不同的二进制数。如当n=2时,有2^2个0和2^2个1排列如图2所示。
如果从a位置开始,逆时针方向取三个数000,然后再从b位置开始取三个数001,接着取010,……。可以得到8个不同的二进制数。
Program shengshu;
Const maxn=16;m=127;
Type ts= set ;
Var axn;
A:] of integer ;
S:ts;
P,y,I:integer;
Function bbb(k,t:integer):boolean;
Var b:Boolean;
Begin
If k=0 then bbb:=true
Else begin
T:= t div 2;
{writeln('k:=',k:4,'t:=',t);}
If t in s then begin
S:=s -[t];{从集合s中除去t}
A[k]:=0;{产生n个0}
matlab二进制字符串转数组B:=bbb(k-1,t);
If not b then s:=s+[t];
End
Else b:=false;
If not b then
Begin
T:=t+ p div 2; {产生下一个数}
{ writeln(';'); }
If t in s then begin
S:=s-[t];
A[k]:=1;{产生n个1}
B:=bbb(k-1,t);
If not b then s:=s+[t]
End
Else b:=false;
end;
bbb:=b;
End;
End;
Begin {主程序}
Readln(n);
p:=1;
for i:=1 to n do
p:=P*2; {计算2^n}
for i:=1 to p+n-1 do
a[i]:=0;
s:=[1..p-1];
if bbb(p-1,0) then
begin
writeln('p-1:=',p-1);
for i:=1 to p do write(a[i]:2);{输出每一位}
end else write('no solution');
writeln;
end.
1
输入:n=4
输出:0 0 0    1    1    1    1 0    1 0    1    1 0 0    1 0

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。