各進制轉換

//本程序是由VS編寫的,所以請把scanf_s改成scanf,才能正常運行。

//思路是先將其統一轉換成10進制再轉化成目標進制。

//爲了保證代碼的正確性,我通過網上的在線進制轉化器 多次測試數據,當然這個程序只能實現2~16進制的轉換。

#include<stdio.h>

#include<math.h>
#include<string.h>
main()
{
char num1[1000], num2[1000];
int n,m;
int i, j, k, sum;
void transX2X(char, int, int ,char);

printf("請分別輸入要轉化的原進制與轉換後的進制:");

//n代表轉換之前的進制,m代表要轉換成的進制

scanf_s("%d%d", &n, &m);
getchar();
gets(num1);
//以上無問題
transX2X(num1, n, m, num2);



} //進制轉化的函數
void transX2X(char num1[], int n, int m, char num2[])
{
int i, j, k, sum1=0,sum2=0;
char letter;
for (j = 0; num1[j] != '\0'; j++)//得出\0的位置,方便下面轉換成10進制。
{
i = 0; //這行代碼是沒有什麼意義的
}
j--; //j代表的數組是\0,所以要自減;
//轉化成對應的10進制數字,並且算出其和。
for (i = 0; num1[i] != '\0'; i++)
{
letter = num1[j];
if ((letter >= '0') && (letter <= '9'))
letter -= '0';
else if ((letter >= 'A') && (letter <= 'F'))
letter =letter - 'A' + 10;
sum1 +=letter * pow(n, i);//算出對應10進制的和
j--;
}


//將10進制的轉化 成對應目標的進制
for (i = 0;; i++)
{
if (sum1 == 0)
break;
if ((m >= 2) && (m <= 10))
{
num2[i] = '0'+sum1 %m;
sum1 /= m;
}
else if ((m > 10) && (m <= 16))
{
if (sum1 %m > 9)
{
num2[i] = 'A' + sum1%m - 10;
sum1 /= m;
}
else
{
num2[i] = sum1 %m + '0';
sum1 /= m;
}
}


}
num2[i] = '\0';//此時數組num2已經保存了目標進制,所以需要一個\0結尾,當然也可以不需要,那麼代碼就如下一個循環輸出。如果有\0就可以不用思考要讀數組中幾個數據了。
printf("\n");
for (i=i-1; i>=0; i--)
{
printf("%c", num2[i]);


}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章