版权声明:[email protected] https://blog.csdn.net/lytwy123/article/details/84578866
1.题目描述:
2.算法分析:
如上是将十进制转换1-16进制,并且有可能会输入负数
首先我们先考虑当输入的要转换的数为0,那么不管是任何进制,转换都是0.
然后考虑进制是否小于10,因为大于等于10之后的进制需要使用字符’A’-‘F’.
考虑进制小于10之后我们又需要考虑需要转换得数是否是负数。
先考虑正数,用短除法,但是需要注意所取得余数应该逆序输出,所以应该存入字符数组或者字符串操作。
当转换的数为0时跳出循环。
对字符数组逆序输出。
然后考虑负数只需要将负数取绝对值求出后在第一位添加-号即可。
当进制>10时,我们考虑多出的字符’A’-'F’即可。
3.源代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
char s[10005];
int main(){
int x,n;
scanf("%d%d",&x ,&n);
int count = 0; //记录存了多少数组
if(x == 0){ //当
printf("0\n");
}
if(n < 10){
int r;
if(x < 0){
int x1 = abs(x);
while(x1 != 0){
r = x1 % n;
s[count] = r + '0';
count++;
x1 /= n;
}
printf("-");
for(int i = count - 1 ; i >=0 ; i--){
printf("%c",s[i]);
}
}else{
while(x != 0){
r = x % n;
s[count] = r + '0';
count++;
x /= n;
}
for(int i = count - 1 ; i >=0 ; i--){
printf("%c",s[i]);
}
}
}else{
int r;
if(x < 0){
int x1 = abs(x);
while(x != 0){
r = x % n;
if(r == 10){
s[count] = 'A';
}else if(r == 11){
s[count] = 'B';
}else if(r == 12){
s[count] = 'C';
}else if(r == 13){
s[count] = 'D';
}else if(r == 14){
s[count] = 'E';
}else if(r == 15){
s[count] = 'F';
}else{
s[count] = r + '0';
}
count++;
x /= n;
}
printf("-");
for(int i = count - 1 ; i >=0 ; i--){
printf("%c",s[i]);
}
}else{
while(x != 0){
r = x % n;
if(r == 10){
s[count] = 'A';
}else if(r == 11){
s[count] = 'B';
}else if(r == 12){
s[count] = 'C';
}else if(r == 13){
s[count] = 'D';
}else if(r == 14){
s[count] = 'E';
}else if(r == 15){
s[count] = 'F';
}else{
s[count] = r + '0';
}
count++;
x /= n;
}
for(int i = count - 1 ; i >=0 ; i--){
printf("%c",s[i]);
}
}
}
return 0;
}
欢迎关注Blog:http://47.107.118.184