版權聲明:您好,轉載請留下本人部落格的位址,謝謝 https://blog.csdn.net/hongbochen1223/article/details/45246025
該執行個體要求使用C實作一個無符号整數到[2,16]進制數的轉換。這個還是比較好想的,就是對該無符号整數不斷的斤進制數d取餘數,取商,一直做這樣的運算,直到商為0為止,将所有的餘數按照從後往前的順序穿起來,就是轉換後的進制數。
下面上我的代碼:
#include <stdio.h>
/** 用于聲明char數組的長度 **/
#define M (sizeof(unsigned int) * 8)
int trans(unsigned int m,int d,char s[]);
/**
* @brief main 将一個無符号整數轉換成任意d進制數(2 << d << 16)
* @return
*/
int main(void)
{
/**
* 思路:将一個無符号整數m轉換成任意d進制數,
* 則可以将m除以d,将餘數從char數組的最後一位
* 向前儲存,同時将商再除以d,以同樣的方式進行處理
* 最後得到的數組就是所對應的d進制數
*/
unsigned int m;
printf("Please enter the digits you want to transform:\n");
scanf("%d",&m);
char str[33];
int i = 0;
printf("The translate results are:\n");
for(i = 2;i <= 16;i++){
int nums = trans(m,i,str);
printf("%d = ",m);
int j = 0;
for(j = 0;j < nums;j++){
printf("%c",str[j]);
}
printf("(%d)\n",i);
}
return 0;
}
/**
* @brief trans 用于對無符号整數轉換
* @param m 要被轉換的數字
* @param d 要被轉換成的進制數
* @param s 存放被轉換後的進制數的數組
* @return 傳回轉換後進制數的長度,也就是數組的長度
*/
int trans(unsigned int m,int d,char str[]){
if(d < 2 || d > 16){
//将s置為0
str[0] = '\0';
return 0;
}
/** 用于儲存進制數 **/
char digits[] = "0123456789ABCDEF";
int i = M;
int j = 0;
char buf[M+1];
/** 用于儲存商 **/
int s = m;
buf[i] = '\0';
//這裡使用do...while
do{
buf[--i] = digits[s % d];
s = s / d;
}while(s);
//對數組s進行指派
for(j = 0;(str[j]=buf[i])!= '\0';j++,i++);
return j;
}
下面是我的運作結果截圖: