Problem Description
输入一个十进制数N,将它转换成R进制数输出。
Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
Sample Input
7 2 23 12 -4 3
Sample Output
111 1B -11
第一种方法,利用C的printf比较方便,仅供参考
#include<stdio.h>
int main()
{
int n,r;
while(scanf("%d%d",&n,&r)!=EOF)
{
if(n<0){
printf("-");
n=-n;
}
if(n==0)
printf("0\n");
int s[100],i=0;
while(n)
{
s[i++]=(n%r); //s[i]=n%r;i++
n=n/r;
}
for(int j=i-1;j>=0;j--)
{
if(s[j]>=10)
{
printf("%c",'A'+s[j]-10); //10-15用A-F表示,%c
}
else
printf("%d",s[j]); //0-9不变,%d
}
printf("\n"); //不写会出现格式错误
}
return 0;
}
第二种方法,事先用数组存储1-9,A-F,倒序输出
#include<iostream>
#include<string.h>
#define maxn 101
using namespace std;
int main(){
long n;
int r;
char arr[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
while(cin>>n>>r){
int a[maxn],len=0;
if(n<0) {cout<<'-';n=-n;}
while(n!=0){
a[++len]=n%r;
n=n/r;
}
for(int i=len;i>0;i--)
cout<<arr[a[i]]; //输出的巧妙之处
cout<<endl;
}
return 0;
}
补充说明:
计算机中我们常用的进制有四种,分别是二进制、八进制、十进制和十六进制。
二进制只有 0和1 两种编码符号,逢二进一。
八进制只有 0-7八种编码符号,逢八进一,第一位是0作为八进制的一个标志。
十进制有0-9 十种编码符号,逢十进一。
十六进制有0-9、A-F 十六种编码符号,逢十六进一,前两位0X作为十六进制的一个标志。