委底师专学报一九八七年自然科学版钾脚帅曰叹少和林洲目味一妇叼~~孟l:乡一、\\、二几}一二拼一厂t尹1_数制转换程序设计杨克昌一、数制转换概述设p为一个大于1的正整数,我们通常记(a:。:一、…a;丙)。为一个户进制整数,其一中数码自任{“,`,~,,珍,(`=“,1,’,,L)。这一p进制数的数停为(aLa加广丙介奋P=口扩P乙十a加1PL一1+.+la沪+如厂不)l人当我们要把一个办进制整数转化“余”法。事实上,由为一个N进制整数时娜转换的方法洱常用除万取脚S=(aaL乙_:…ax丙),=(br吞犷`;…b;bo)刀二b(:N,一’+衍一叮N,一2+…+卜),下+`(”)把需转换的数除以N时注意到上式()中的商武为尸整一熬所得余数(小于N的非负整数)即为b。。所得的商bTN,一’一卜b:,N,一’+…+b,再除以N,余数即为b,。依此类推,直到所得的商小于N时,转换完毕,此时的商即为转换得到的N进制数的首位数b:。同样,我们记(0.a_;a_2…a_,)尸为一个P进制小数,其数值为(0a一la一’2二a一,)P=a一,P一1+a_2、夕一么+…+a_。P一,(3)当我们要把一个p进制小数转化为一个N进制小数时,转换的方法通常用“乘N取整”法,事实上,由“二`0“一`“一,’’“一”一不“:全一沪一,“一:”’b_;*,分贾六~十牛了V方矿箫(4)故N。=b-i+(+*韶箫注意到上式()中的数为方、于:的正数,航把需转换的一b了万一ó冰尹主小数乘N时,所得积的整数部分(小于砰的非负整数)即为二b_3b份所得积的小数部分万人一再乘以N,积的整数部分即b_2。依此类推,直到乘N所得积为整数时转换完毕或转换到所要求的小数位数时为止。以上整数转换的“除N取余”法及小数转换的“乘N取整”法将作为我们设计转换孕召程序的基本算法。二、十进数转换为二进制数,把十进制数A转换为二进制数我们只要反复用除1):2取余即能实现,下面的程序1`郎为千金制转二进制的一个祖序伙程序01023O4050606570801凡PU全IFX=AINT(AAl/2二)/2THEN和GOTOXIFIFT5Ao=700A=1oTHEN110120ATS=乍HEN八++X婚101S=09100110120130=INT(A/2)20I带10八(S+1)+GOTOPRINTPRINTENDT:GOTO130TURUN?500111110100URUN?700101011llE+09由运行(指在APPLE,,五上运行2,下同)可知。,该程序的转换范围太窄,转换的数,稍大(例如键入700)时即不能实现准确的转化根据除为了能扩大转换范围102030里05060取余的原理并应用字符串函数gT农奉(Y)2):可设计出以下一个非常简明的十进制转二进制的实用程序(序程INPUTBC=AINT=(A/2):Y+二八一C$:2,B=$STR$(Y)ABIFB<>oCTIJEN20PRINTEND$URUN?70Q97兴之主。圣一。一程序“中,每次除“得到的商为B,余数为Y,3时手把余数Y租为字符后加到脸串C$的左端。当商B不为。时继续以上02一30行的除2取整;当商月为兮对,产转换即告结束,程序于05行作打印输出,C$即为转换的只进制数。程序召可非常方便地实现__九位以内十进制数(指在APPLE兀的转换为二进制数。三、十以内数制的相互转换以上两个数制转换程序只能实现十进制数转换为二进旅日数,既不能逆转,也不能转变为其他数进制,转换功能单一。我们自然地希望能设计出一个程序,完成十以内数制之间的相互转化。这样,使用起来就方便多了。基于这一想法,我们设计了程序3:)犷01INPUT“P,N二”P,N一13IFP二NTHEN3201一支::::51IFP10THEN01;:20IFN<2ORN>LoTHEN1030INpUTA$45IFP=20THENS=VAL(A$):GOTO12005D二LEN(A本):S=0:T“160FORJ=DTO1STEP一108X二VAL(MID$(A$,J,)1)905=S十T.X:T=T.P、10NEXTJ210C零“#II卜}、130IFS>二IE9THEN01一一`几。_41oA二INT(S/N):Y节S一二A,N-二、L51oC$二STR本(Y)+C多`AIGoIFS(>0THEN140020pRINT“(l,,A$,’l)扩;P;“=l(,,C岑,“),,;N一;!220GOTOIO“、230PRINTEND”:END{URUNP,N二10,2?123456798(P,2(N=22,8?111010110111100110100010101(111010110111100110100010101)2P,=(7267425)8N=8,10?7267425(7267425)8P,=(1234567)10N二2,2END运行程序程序中的输入尸,,3,可完成二至十之间任两进制数之间的相互转换,。。第10一3州于为输入段第,包括从尸进制转换为N进制的整数尸、N任比S,10〕转换数A$的输入即跳过50一45一土10行为把输入的尸进制数转化十进数值((如果。]为0,11。行)其中90行为尸进制数数值计算公式,)1的具体体现第140一160,行的功能为除N取余。每次除以N后S。,把余数Y转化为字符存放在C$的为左端志。并把商月变为下一轮除N的被除数,除N取余直到商(即下轮的被除数,S)。时结束第200行作打印输出,第220,0行作连续转换行转移到1万值相等即转230尸二N为终止标当完成所有转换后以上程序3只要键入的尸行结束。。的转换实际上是由尸进制转换为十进制数S及由S转换为刃进制这两个。转换步骤组成的其中十进制数S为完成转换而引入的中间参量,程序[I3的转换范围与,程序程序C2相同,即转换数值不能超过十进制数九位,(指在APPLE2,上)所不同的是。3可实施二至十中各进制之间相互转换程序3。比程序的单一转换应用要广得多值得指出的是的输入数是作为字符串月$输入,输出也是转化为字符串为避免因此造成$作显示打印的,,因转换数值不超过十进制数九位、同样这一数值表为十以内的其他进制时可能超过九位从而超出APPLEI工机有效数字九位的。。的转换失误引入字符串作输入四、输出是非常自然的十六以内数制多位数的相互转换:在转换程序,3的基础上我们迸一步考虑以下两个问题,1)、能否把十以内数制之能否把转换数值的范时导致,间的相互转换再行扩大围再行扩大制?实现十六以内数制之间的相互转换?,2)、““使得转换数不受九位的约束,,,,0甚至不受当大于1,“溢出”的限在十六进制中D表13E、除了数码。。l,一9外0通常引入A表1,方表nB即可,C表1’2(C、,,E表j吐’j表巧1,相应地。在十二进制中只要另引入A、刀、F就不引入)依此类推为了把输入转换数月本字符串中的每一字符转化为相应的数值(例如把数码为11)由1,B转化程序中设置了参照字符串16)D华二“0123圭56?ABCDEF”’,D,本中的第工个(工至。字符对应的数值为工一匕例如B为D孚中的第12个子符即B对应的数值为」土同时l),,为了字符逐个转化比较方便我们经常附到字符串函数。,,Mln本但串,3工,本中的第工个字符程序设计中为了解决第二个问题实现多位数的转换,其功能为取D(十进制数):,必须改进程俘(。少:。:_一中引入中间参量s的作法,直接从p,班制数作除N取余宕Y乘以尸Y尸:…。:a0)歹瞬以N的+’实施过程是这样的首先用,。。:除以N所得余数,后加上,:;,即以YY,户a:一,作…为下一位的被除数依此类推laa)尸除以N所得的余数o程序354直到+a。除以N时所得余数就是(处处-_:的清单为:一REMPDIMN:,(216)A(10。)越P,1013rNPUTIFIFIFPPN二N二,,P0,NNTHEN邓1任51<妙O及P)THEN,HEN0101’一0230招ORA孚一N)61一_IN移U个D二幼60LE饰认攀)刃$TOD,二“812和“709ABCDEF从FORB吊二FORJ二I肠知758于85一破公争I一(A本邪,;J:,D’、计二1一TO工FM犯本(瑟EX个IGOiF衅交I,卜)1二B$THEN”如l物I、加I,J{》PTHE耳帅1一仁介、眺直帷)110NEXT112113115C本=5=,11,0:YJ==o1`飞爹;FORTO.DPY二G二…A(J).N一’’火11了G只人()j12Q人丈协出$,圣跨T怜/双姐THEX.l艺5130’IF5=S/尹)N(S+3云1:A(J))JP王3乐N卫XT巧氏C1602。。22心230本二SMID<$>A(D0冬,Y十l,)1*C孚C1IFTHEN113PR班T叹“;GO中0PRINT10“本,:勺尸,P;萨二(“;本;勺八落END”END00飞口RUP,N=N10,l6?111115555599999(111115555599939)10F,二(65OFIB3a767F)16N二:26,8?650F土B38767F(650FIB38767F)16F,二(3120743316073177)8N=8,10?3120743316073〕77(3120743316073177)8F,“(111115555599999)10N=2,2END0一30为输入段程序中1;0一1051为尸进制的数码转换段;,即把输入数段本中的每一宇符依次转化为对应的数值为字符存放在运行程序尺(100)C41131500为除万取余段一16行完成的。“”,每除以N后所得余数y转化200零的左端是由转换完毕后于。行打印转换结果,。可完成十六以内各进位制之间多位数的相互转换0第5行数组说明,0意味着转换数可达1,位,这已经足够了必要时可把。10,加大最大可定到月(25C5)即转换数可达255255位(字符串常量的最大长度)当然转换后的N进制数孚也不得多于位。五在程序351013152030504、数制万能转换程序5:的基础上增加小数转换功能即得到以下数制万能转换程序PA。REMDIM一N。(2,16)(100)“INPUTIFIFIFPPN=P一,N=’,;P,NNT工IEN2801626?”(2ORF少公ORN><“THENTHEN;1010,INPUTDH八本,QA冬Q,本二=“01234567ABCDEF沥606570。,D二LEN(A本),FORJ二1TODB本二MIDFORI二$(A本I,J,1)1TO16,肠808吞厅H二:MI孚(D零DIGOTO:)1二B冬THEN加NEXTJ11010190A(J)=I一1110NEXTJ112C$=,1135=0:Y二O114IFQ=0ANDH二0THENH二D+1115FORJ=1TOH一1117G二A()J十Y.P21oAJ()“工NT(G/N):Y二G一A(J.)N一225IFS/P)NTHEN1351305=(S十A(J))帝P135NEXTJ15oC$“MID本(D$,Y+1,1)+C本160IFS<)0THEN113一ZOQIFQ=OTHENZ60Zo5G攀二C$+伙.卜Y二021OK泛O:S二0215FORJ二DTO月+1STEP一1220G二A(J).N十K:K二INT(G/卫)_225A(J)二G一K.P:S士5十A()J230NEXTJ24oC本二C$+MID$(D布,K+i,i):Y二Y+1250IFS<>0ANDY`Q建珍写N210260PRINT“(“;A孚多”)”,P,“二(“,C本;”)”;N270GOTO10:`280PRINT’,END,:ENDENUURUNP,N=10,sA本,Q=1122334吐5566。7788,6(112233445566。7788)10“(1504150474276.616575)8P,N“16,10A本,Q=iEZF3A4BSC6DiZAB,6(iEZF3A4BSC6D12AB)16=(33188190313581072921)aoP,N=2,2END我们之所以称这一程序为万能转换程序,是因为它功能强而全:从转换数的进制上说,程序可实现十六以内任意两种进数制之间的相互转换,从转换数的位数上说,可不受有效数字或“溢出”界限,可实现一般多位数的转换,从转换数的类型上说,可102以是整数,也可以是小数或带小数;。0一30行为输入段程序中10一5110行把输入数A$的每一字符转化为相应数值16。行实施除N。。如果有小数点则记下小数点的位置分的转化是否停止。(第H,位)。13一1取余,完成整数部0一250行实施乘N取整第21,完成小数部分的转化(S寺。)第250行判断小数转换:若乘N取整后的小数部分不为零且已转换小数部分位数Y还不到。须转换的小数位数Q时运行时必须注意若只转换整数,继续返回210行作乘N取整转换小数,否则(即已把小数部分。全转换完或转换位数达到要求的Q位)即行停止转换:于260行打印转换结果。在输入转换数。,,A$时,必须同时输入须转换的小数位数Q的值A,。则输入Q的值为,不管此时输入数,$中有没有小数点在运行程序作数制转换时位数数制转换的程序设计中于篇幅,随着转换数位数的增加,转换的时间也就越长。在作多。如何缩减转换时间是我们值得进一步研究的课题在本文提供的数制转换程序的基础上这里从略,我们可设计出各数制数的四则运算程序。,限有兴趣的读者不妨白行完成参[i考,文献,」LMoos,(德),l《」》数希,林尔康译,科学出版社(1984)长沙交通学院。仁2勺〕〕彭仲昆《计算导论》,湖南电视台1986年第5,。〔3〕[[45《程序二则》《电脑》期《程序设计中应注意的一个问题》《+进制与二进的小数转换》,《电脑》1987年第l期。《计算机教与学》1986年第61987年第1期。〔6〕十—十六进位数制转换,《苹果园》期。(上接第58页)参考(5)文11献(1984)(第二版),〔1」徐贤恭、谢周,,化学通报,〔2〕顾可权编著[3」《重要有机化学反应》,上海科技出版社,,(1983),吉林师大刘宗明编(1982),,华南师院等编《有机化学》(下册)人民教育出版社,(1980)、巨4],《对称守恒原理及其在有机化学中的应用》高等教育出版社〔5口同〔4〕〔6〕同[1P185一191P15。〕,103