- 问题描述:(进制转换)在实际问题中经常需要对不同的进制进行转换,现在由你来实现将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
- 问题描述:(确定进制)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
- 问题描述:(负进制转换)在不同进制数的转换过程中,一个十进制数可以转换成一个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); } } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
问题及解决方法,心得:(实验中遇到的问题和解决问题的方法)
评定成绩: