記事ディレクトリ
序文
生活の中で最も一般的な基数は 10 進数で、10 進数を他の基数に変換する必要があるプログラミングの問題があります. このブログでは主に、C 言語でよくある基数変換の問題について説明します.
1. 10 進数を 2 進数と 8 進数に変換する
方法: たとえば、10 進数の 100 を 2 進数に変換するには、100 を 2 で割って商と剰余を求め、商が 0 になるまで商を 2 で割ります。剰余を順番に記録し、剰余を逆順で出力します。これが 2 進数の結果です。8進法も同じで、商を連続して8で割り、最後に商が0になり、剰余を順に記録し、剰余を逆順に出力するのが8進法の結果です。この方法は、2 から 9 に変換する任意の基数に拡張することもできます。
グラフィックは次のとおりです。
コードは以下のように表示されます:
#include <stdio.h>
int main()
{
int x, n;
scanf("%d %d", &x, &n);//x是要转换的十进制数,n为要转换成的进制
int arr[100] = { 0 };//创建一个足够大的数组来存放余数
int i = 0,j = 0;
while (x)
{
arr[i++] = x % n;//存放余数,i最后的值正好是余数的个数
x /= n;
}
for (j = i - 1; j >= 0; j--)
{
printf("%d", arr[j]);//余数倒序输出
}
printf("\n");
return 0;
}
2. 10 進数を 16 進数に変換する
10進数から16進数への変換も、商を連続して16で割って逆順に出力するなどの方法が必要ですが、16進数ではA\B\C\D\E\Fなどの文字が出てくるので足す必要もあります。残りはさらに変換されます。コードは以下のように表示されます:
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
char arr[100] = { 0 };//因为十六进制中会出现A\B\C\D\E\F等字符,所以保存余数的数组类型应定义为char
int i = 0, j = 0;
while (x)
{
arr[i++] = x % 16;
x /= 16;
}
for (j = 0; j < i; j++)
{
//将取出的余数转换为对应的字符
switch (arr[j])
{
case 10:arr[j] = 'A'; break;
case 11:arr[j] = 'B'; break;
case 12:arr[j] = 'C'; break;
case 13:arr[j] = 'D'; break;
case 14:arr[j] = 'E'; break;
case 15:arr[j] = 'F'; break;
default:arr[j] += 48;
}
}
for (j = i - 1; j >= 0; j--)
{
printf("%c", arr[j]);//逆序打印
}
printf("\n");
return 0;
}
3. 2 進数と 8 進数を 10 進数に変換する
方法: 入力数値の各ビットを取り出し、このビットの重みを掛けて、最後に結果を加算する必要があります。
コードは以下のように表示されます:
#include <stdio.h>
#include <math.h>
int main()
{
int n = 0, sum = 0, i = 0, x = 0;
scanf("%d %d", &x, &n);//x为输入的二进制或八进制的数,n为进制。
while (x)
{
sum += (x%10)*pow(n, i++);//x%10将x的每一位取出,再与这个位上的权重相乘。
x /= 10;
}
printf("%d\n", sum);
return 0;
}
4. 16 進数を 10 進数に変換する
16 進数には A\B\C\D\E\F などの文字が含まれているため、入力時に文字列を入力したと見なすことができ、最初に各文字を対応する数字と標準に変換する必要があります。合計して最終値を取得します。
コードは以下のように表示されます:
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char arr1[100] = { 0 };
scanf("%s", arr1);
int len = strlen(arr1);
int i = 0, sum = 0;
for (i = 0; i<len; i++)
{
int temp = 0;
switch (arr1[i])
{
case 'A':temp = 10; break;
case 'B':temp = 11; break;
case 'C':temp = 12; break;
case 'D':temp = 13; break;
case 'E':temp = 14; break;
case 'F':temp = 15; break;
default:temp = arr1[i] - '0'; break;
//将各个位上的字符转换为对应的数字
}
sum += temp * pow(16, len-i-1);//各个位上的权重相乘再相加
}
printf("%d\n", sum);
return 0;
}