实验六 进制转换

  1. 问题描述:(进制转换)在实际问题中经常需要对不同的进制进行转换,现在由你来实现将P进制数转换成R进制数(2≤P,R≤16)。

输入:数据包括多行,每行包括三个数据,分别为P、R和待转换的P进制数(此数的十进制表示小于100000000),数据中用字母表示时所用字母均为大写(可能用到的字母为ABCDEF),当输入的数据中P为0时表示输入结束,并且此行不处理。

输出:对应每行输入有一行输出,并且每行只有一个数据,为转换后的R进制数。

输入样例

10   16   155

16   8    1A

0    0    0

输出样例

9B

32

  1. 问题描述:(确定进制)6×9=42,对于十进制来说是错误的,但是对于十三进制来说就是正确的,即6(13)×9(13)=42(13),而42(13)=4×131+2×130=54(10)。你的任务是编写一段程序读入三个整数p、q和r,然后确定一个进制B(2≤B≤16),使得p×q=r。如果B有很多选择,则输出最小的一个。例如:p=11,q=11,r=121,则有11(3)×11(3)=121(3),因为11(3)=1×31+1×30=4(10)和121(3)=1×32+2×31+1×30=16(10)。对于十进制,有11(10)×11(10)=121(10)。这种情况下,应该输出3。如果没有合适的进制,则输出0。

输入:输入有T组测试样例,T在第一行给出。每一组测试样例占一行,包含三个整数p、q、r。p、q、r的所有位都是数字,并且1≤p,q,r≤1,000,000。

输出:对于每个测试样例输出一行。该行包含一个整数:即令p×q=r成立的最小的B。如果没有合适的B,则输出0。

输入样例

3

6   9   42

11  11  121

2   2   2

输出样例

13

3

0

  1. 问题描述:(负进制转换)在不同进制数的转换过程中,一个十进制数可以转换成一个R(R>0)进制数,通常称R为基数。一般来说,任何一个正整数R或一个负整数-R都可以被用来作为一个数制系统的基数。如果是以R或-R为基数,则需要用到的数码为0,1,2,...,R-1。例如,当R=7时,所需用到的数码是0,1,2,3,4,5,6,这与其是R或-R无关。如果作为基数的数的绝对值超过10,则通常是用英文字母来表示那些大于9的数码。例如对于十六进制数来说,用A、B、C、D、E、F分别表示10,11,12,13,14,15。在负进制中是用-R作为基数,例如十进制的-15相当于二进制的110001,并且可以被表示为2的幂级数的和的形式:110001=1×(-2)5+1×(-2)4+0×(-2)3+0×(-2)2+0×(-2)1+1×(-2)0。现给定一个十进制数和一个负进制的基数,设计一个程序将此十进制数转换成此负进制下的数。其中,-R∈{-2,-3,-4,...,-20}。

输入:输入有T组测试样例,T在第一行给出。每一组测试样例占一行,包含两个数据,第一个是十进制数N(-32768≤N≤32767),第二个是负进制数的基数-R。

输出:对于每组测试样例输出一行。该行包括此负进制数及其基数,若此基数超过10,则对应的数码用大写字母表示。

输入样例

4

3000    -2

-20000   -2

28800   -16

-25000   -16

输出样例

30000=11011010101110000(base-2)

-20000=1111011000100000(base-2)

28800=19180(base-16)

-25000=7FB8(base-16)

实验结果与分析(运行界面截图,打开需要截的图,按ALT+PrintScreen后,将光标移到下面,单击右键后选择“粘贴”):

 1.

(Ⅰ)程序代码及注释

#include <stdio.h>

#include <string.h>

int main(int argc, char *argv[])

{

int i,n,p,r,k;

char d[31];

long m;

while(1)

{

scanf("%d%d%s",&p,&r,d);

if(p==0)break;

m=0;k=1;

for(i=strlen(d)-1;i>=0 ;i-- )

{

if(d[i]<='9')

m+=(d[i]-'0')*k;

else

m+=(d[i]-'A'+10)*k;

k=k*p;

}

d[30]='\0';

k=30;

while(m!=0L)

{

n=m%r;

if(n>=10)

d[--k]=n-10+'A';

else

d[--k]=n+'0';

m=m/r;

}

printf("%s\n",&d[k]);

}

return 0;

}

(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析

2.

(Ⅰ)程序代码及注释

#include <stdio.h>

int maxdigit(int m)

{

int maxd=0,k;

while(m!=0)

{

k=m%10;

if(k>maxd)maxd=k;

m=m/10;

}

return (maxd);

}

int convtdecimal(int m,int k)

{

int p,s;

s=0;p=1;

while(m!=0)

{

s+=m%10*p;

m=m/10;

p=p*k;

}

return s;

}

int main(int argc, char *argv[])

{

int p,q,r,B,n,i,d,dp,dq,dr;

scanf("%d",&n);

for(i=0;i<n;i++)

{

scanf("%d%d%d",&p,&q,&r);

B=maxdigit(p);

d=maxdigit(q);

if(d>B)B=d;

d=maxdigit(r);

if(d>B) B=d;

for(B++;B<=16;B++)

{

dp=convtdecimal(p,B);

dq=convtdecimal(q,B);

dr=convtdecimal(r,B);

if(dp*dq==dr)break;

}

if(B>16)B=0;

printf("%d\n",B);

}

}

(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析

3.

(Ⅰ)程序代码及注释

#include <stdio.h>

#include <string.h>

int main(int argc, char *argv[])

{

char digit[]={"0123456789ABCDEFGHIJ"};

char result[100];

int t,n,r,i,j,k,m,s;

scanf("%d",&t);

for(i=0;i<t;i++)

{

scanf("%d%d",&n,&r);

result[99]='\0';m=99;

s=n;

while(n!=0)

{

if(n>=(n/r)*r)

{

k=n-(n/r)*r;

n=n/r;

}

else

{

k=n-(n/r+1)*r;

n=n/r+1;

}

result[--m]=digit[k];

}

printf("%d=%s(base%d)\n",s,&result[m],r);

}

}

(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析

问题及解决方法,心得:(实验中遇到的问题和解决问题的方法)

评定成绩:

在汇编语言中进行进制转换实验可以有多种方式,以下是相关资料的综合介绍。 ### 实验目的 实现一个用户友好的进制转换器,允许用户将一个介于0到65535之间的十进制数转换为二进制、八进制或十进制形式,并在屏幕上显示转换结果,锻炼汇编语言编程技巧,为用户提供实用的进制转换工具 [^1]。 ### 实验步骤 1. **需求分析**:明确要实现的进制转换功能,如十进制转二进制、八进制、十进制等。 2. **设计算法**:根据不同进制转换的规则设计相应的算法。 3. **编写代码**:使用汇编语言实现设计好的算法。 4. **调试代码**:检查代码是否能正确实现进制转换功能,并处理可能出现的异常情况。 5. **测试验证**:使用不同的输入数据对程序进行测试,确保转换结果的准确性。 ### 代码示例 以下是一个简单的将十进制数转换为十进制数并显示的汇编代码示例(以8086汇编为例): ```asm .MODEL SMALL .STACK 100H .DATA DECIMAL_NUM DB 50 ; 待转换的十进制数 HEX_MSG DB 'Hexadecimal: $' HEX_RESULT DB 2 DUP('0'), '$' .CODE MAIN PROC MOV AX, @DATA MOV DS, AX ; 显示提示信息 LEA DX, HEX_MSG MOV AH, 09H INT 21H ; 十进制转十进制 MOV AL, DECIMAL_NUM MOV BL, 16 DIV BL MOV HEX_RESULT, AL MOV HEX_RESULT + 1, AH ; 将数字转换为ASCII码 MOV AL, HEX_RESULT CMP AL, 0AH JL ADD_30 ADD AL, 07H ADD_30: ADD AL, 30H MOV HEX_RESULT, AL MOV AL, HEX_RESULT + 1 CMP AL, 0AH JL ADD_30_2 ADD AL, 07H ADD_30_2: ADD AL, 30H MOV HEX_RESULT + 1, AL ; 显示十进制结果 LEA DX, HEX_RESULT MOV AH, 09H INT 21H ; 退出程序 MOV AH, 4CH INT 21H MAIN ENDP END MAIN ``` ### 实验报告 #### 实验名称 汇编语言进制转换实验 #### 实验环境 - 操作系统:Windows - 汇编器:MASM #### 实验内容 实现十进制数到十进制数的转换,并在屏幕上显示转换结果。 #### 实验结果 程序能够正确将十进制数转换为十进制数并显示。 #### 实验总结 通过本次实验,掌握了汇编语言中进制转换的基本方法,提高了汇编语言编程能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值