实验六 进制转换

  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);

}

}

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

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

评定成绩:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值