题目
编制函数Itob(int n, char s[], int b),将整数n转化为b进制表示形式,结果存入数组s中,
b的取值范围是2,8,16,s的最大长度为100.
思路就是先将整数转换为二进制数,然后将二进制数转换为8进制和16进制。没有什么难度,考验的是基础和细致度。
代码
#include<stdio.h>
#include<string.h>
#define maxl 105
void reversed(char s[]){
char temp;
int len = strlen(s);
for(int i = 0;i < len/2;i++){
temp = s[len-1-i];
s[len-1-i] = s[i];
s[i] = temp;
}
}
void Itob(int n, char s[], int b){
// 先将n转换为二进制,结果倒序存入数组备用
char res[maxl];
int temp, cur, len;
cur = 0;
while(n/2!=0){
res[cur++] = n % 2 + '0';
n /= 2;
}
res[cur++] = '1';
res[cur] = '\0';
cur = 0;
len = strlen(res);
// 转二进制
if(b==2){
for(int i = 0;i < len;i++){
s[i] = res[i];
}
s[len] = '\0';
reversed(s);
}
// 转八进制
if(b==8){
int loop_count = len / 3;
int remain = len % 3;
for(int i = 1;i <= loop_count;i++){
temp = (res[(i-1)*3]-'0')*1+(res[(i-1)*3+1]-'0')*2
+(res[(i-1)*3+2]-'0')*4;
s[cur++] = temp + '0';
temp = 0;
}
if(remain==0){
s[cur] = '\0';
reversed(s);
}
else if(remain==1){
s[cur++] = 1 + '0';
s[cur] = '\0';
reversed(s);
}
else if(remain==2){
s[cur++] = 2 + (res[len-2]-'0') + '0';
s[cur] = '\0';
reversed(s);
}
}
// 转十六进制
if(b==16){
int loop_count = len / 4;
int remain = len % 4;
for(int i = 1;i <= loop_count;i++){
temp = (res[(i-1)*4]-'0')*1+(res[(i-1)*4+1]-'0')*2
+(res[(i-1)*4+2]-'0')*4+(res[(i-1)*4+3]-'0')*8;
if(temp<10){
s[cur++] = temp + '0';
}
else{
s[cur++] = 'A' + temp - 10;
}
temp = 0;
}
if(remain==0){
s[cur] = '\0';
reversed(s);
}
else if(remain==1){
s[cur++] = 1 + '0';
s[cur] = '\0';
reversed(s);
}
else if(remain==2){
s[cur++] = 2 + (res[len-2]-'0') + '0';
s[cur] = '\0';
reversed(s);
}
else if(remain==3){
s[cur++] = 4 + (res[len-2]-'0') * 2 + (res[len-3]-'0') + '0';
s[cur] = '\0';
reversed(s);
}
}
}
int main(){
char s[maxl];
int n, b;
while(scanf("%d %d", &n, &b)==2){
Itob(n, s, b);
printf("%s\n", s);
}
return 0;
}