解题思路
说下几个坑吧:
1、不可以直接用scanf格式化读入,可以拿部分分,但是如果读入30,格式化输出的是1e 而不是1E,结果区分大小写。
2、如果读入的是0,可以直接输出0,就不会进入while循环转换成16进制了,如果不特判,就会有可能输出空字符。
Ac代码
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
long long n;
cin >> n;
string s;
s="";
if(n == 0){
cout << 0 <<endl;
return 0;
}
while(n){
int x = n % 16;
if(x < 10) {
char xx = x + '0';
s = xx + s;
}
else{
switch(x){
case 10 : s = 'A' + s;break;
case 11 : s = 'B' + s;break;
case 12 : s = 'C' + s;break;
case 13 : s = 'D' + s;break;
case 14 : s = 'E' + s;break;
case 15 : s = 'F' + s;break;
}
}
n /= 16;
}
int flag = 0;
for(int i = 0; i < s.length();i++){
if(s[i] !='0') flag = 1;
if(flag)cout<<s[i];
}
return 0;
}