題目
編制函數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;
}