2009年4月18日 星期六

知識+ 某數A的B進制

//=================================================================
// 20090411 知識+
// http://knowledge.yahoo.com.tw/question/question?qid=1609041106275
// 發問者: http://tw.knowledge.yahoo.com/my/my?show=AB04702665
//=================================================================

#include <stdio.h>
#include <stdlib.h>

int main()
{
int A, B;
unsigned int n; // 用正整數 n 來進行轉換處理
char str[33]; // 這足夠存放32位元整數的轉換字串了!!
while(1) // 循環執行, 若要單次執行, 可移除這行
{
char * p = str+sizeof(str)-1; // 設p指標指到存放字串位置的末端
printf("\n請輸入數目(%d~%d): ", 1<<31, (1u<<31)-1 ); //最小值與最大值
scanf("%d", &A);
printf("請輸入要轉換的進制數(2~36,超出範圍將結束): ");
scanf("%d", &B);
if (B<2 || B>36) return 0;
*p = '\0'; // 字串最末端先放 0 (為字串的結尾)
for(n=(A>0)? A: -A; n>0; n/=B) // 用迴圈進行進制轉換(若A為負數,改取正數)
*--p = (n%B<10)? '0'+n%B: 'A'+n%B-10; //將p逐位往前,並逐一存放轉換字元
if (A==0) *--p = '0'; // 若輸入的A為0, 就在字串中放0
else if (A<0) *--p = '-'; // 若輸入的A為負數, 則轉換後的字串前也補 '-'
printf( "%d的%d進制表示為: %s\n", A, B, p);
}
return 0;
}

//==下面程式碼是改用陣列索引的方式, 並用位元填滿的方式處理正負號(補數)

#include <stdio.h>
#include <stdlib.h>

const int bits = sizeof(int)*8;

int main()
{
int A, B, p;
unsigned int n, m; // 用正整數 n 來進行轉換處理
char str[bits+1]; // 這足夠存放int整數的轉換字串了!!
while(1)
{
p = sizeof(str)-1; // 設索引指到存放字串位置的末端
printf("\n請輸入數目(%d~%d): ",1<<(bits-1), (1u<<(bits-1))-1 );
scanf("%d", &A);
printf("請輸入要轉換的進制數(2~36,超出範圍將結束): ");
scanf("%d", &B);
if (B<2 || B>36) return 0;
str[p] = '\0'; // 字串最末端放 0 (為字串的結尾)
for(n=A, m=-1; m>0; n/=B, m/=B) // 用迴圈進行進制轉換
str[--p] = (n%B<10)? '0'+n%B: 'A'+n%B-10; //將p逐位往前,並逐一存放轉換字元
printf( "%d的%d進制(%d位元)表示為: %s\n", A, B, bits, &str[p]);
}
return 0;
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~






沒有留言:

張貼留言