【题解】转换的问题
【题目描述】
那么,问题来了:
输入一个十进制数N,将它转换成R进制数输出。
【输入描述】
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
【输出描述】
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)
【样例输入】
7 2 23 12 -4 3
【样例输出】
111 1B -11
【题目分析】
比较经典的进制转换
考虑使用递归的方式实现
【参考代码1】——简单递归实现
#include<iostream>
using namespace std;
void calculate(int n,int k)
{
char num[16]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int temp;
temp=n%k;
n/=k;
if(n!=0)//判断是否到达边界n=0
calculate(n,k);
cout<<num[temp];
}
int main()
{
int x,m;
cin>>x>>m;//输入十进制数x与要转换成的进制m
calculate(x,m);//调用函数进行转换
cout<<endl;
return 0;
}【参考代码2】——使用全局变量保存(没有考虑负数)
#include<iostream>
#include<cstring>
using namespace std;
char num[16]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char ans[100]; //结果数组
int p=0;
void calculate(int n,int k)
{
int temp;
temp=n%k;
n/=k;
if(n!=0)//判断是否到达边界n=0
calculate(n,k);
ans[p]=num[temp];
p++;
}
int main()
{
int x,m;
while(cin>>x>>m)
{
calculate(x,m);//调用函数进行转换
//输出
int len=strlen(ans);
for(int i=0;i<len;i++)
{
cout<<ans[i];
}
cout<<endl;
//初始化数据
p=0;
memset(ans, 0, sizeof(ans));
}
cout<<endl;
return 0;
}【参考代码3】——考虑负数问题
#include<iostream>
#include<cstring>
using namespace std;
char num[16]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char ans[100]; //结果数组
int p=0;
void calculate(int n,int k)
{
int temp;
temp=n%k;
n/=k;
if(n!=0)//判断是否到达边界n=0
calculate(n,k);
ans[p]=num[temp];
p++;
}
int main()
{
int x,m;
while(cin>>x>>m)
{
int flag=0;
if(x<0)
{
flag=1;
x=-x;
}
calculate(x,m);//调用函数进行转换
//输出
int len=strlen(ans);
if(flag) //判断负数情况
cout<<"-";
for(int i=0;i<len;i++)
{
cout<<ans[i];
}
cout<<endl;
//初始化数据
p=0;
memset(ans, 0, sizeof(ans));
}
cout<<endl;
return 0;
}扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。
