Enter The Number You Want To Octal Equivalent Of : 1701
5
45
245
3245
これを試して、役立つかどうかを確認してください(数学ライブラリにリンクする必要はありません)
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int y = 0;
int n = 1;
printf("Enter The Number You Want To Octal Equivalent Of : ");
scanf("%d",&x);
while(x>0)
{
y = y + ((x%8)*n);
printf("%d\n" , y);
x = x/8 ;
n = n * 10;
}
printf("Octal Equivalent is : %d" , y);
return 0;
}
そして、私はあなたがこれを行うことができることを知っていると思いますか?
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int y = 0;
int n = 1;
printf("Enter The Number You Want To Octal Equivalent Of : ");
scanf("%d",&x);
while(x>0)
{
y = y + ((x&7)*n);
printf("%d\n" , y);
x = x>>3 ;
n = n * 10;
}
printf("Octal Equivalent is : %d" , y);
return 0;
}
またはASCIIアプローチを取る
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int y = 0;
int n = 0;
char output[16];
printf("Enter The Number You Want To Octal Equivalent Of : ");
scanf("%d",&x);
while(x)
{
output[n++]=(x&7)+0x30;
x = x>>3 ;
}
output[n]=0x30;
printf("Octal Equivalent is : ");
while(n>=0)
{
printf("%c",output[n--]);
}
printf("\n");
return 0;
}
または他の多くのソリューション...
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x;
int y = 0;
int n = 0;
printf("Enter The Number You Want To Octal Equivalent Of : ");
scanf("%d",&x);
while(x)
{
y |= (x&7)<<n;
n+=4;
x>>=3;
}
printf("Octal Equivalent is : %X\n",y);
return 0;
}
編集
1701 = 0x6A5 = 0b011010100101
したがって、2 進数を 4 でグループ化すると、16 進数の値が表示されます (右から開始)。
0110 1010 0101 = 0x6A5
3 つのグループに分割すると、8 進数が表示されます。
011 010 100 101 = 03245
そして、私が示した最後の解決策がどのように機能するかを見ることができます。これらのそれぞれにゼロを付けてください
011 010 100 101
0011 0010 0100 0101
そして0x3245
、ベース10で行っていたのとまったく同じですが、代わりにベース16を使用し、シフトとマスクを使用する最適化を利用しています。
編集2
この 1 行のコードでどれだけのことが行われているのかを理解する (x と y が int であると仮定)
y = y + (x%8)*pow(10,n);
最初の操作順序。コンパイラは歓迎されており、最初にモジュロを実行する必要がありint
ます。操作の次の順序、括弧はすべての疑いを取り除きます。次は乗算ですが、オペランドの 1 つが a であるdouble (pow)
ため、モジュロの結果を に昇格する必要がありdouble
ます。二重乗算が発生します。int
これで、一方が他方であることが追加されましたdouble
。したがって、この y は に昇格しdouble
、double
加算が行われ、次に がdouble
たまたまint
に格納されy
ます。n go1, 10, 100, 1000
などを作成する私の最初のより単純な例を見ると、プロモーションは常にint
ありません。double
int
を作成y
する場合float
、加算は であるfloat + double
ため、倍精度に昇格する必要があります。以前のように二重加算が行われますがy
、等号の左側へのストレージが a として、 to変換が可能になり、丸めます。そのため、ループを通過するたびに、わずかな部分が. ここでの問題、少なくともあなたの例では、浮動小数点形式が処理できない分数は見られません。モジュロは として実行されることになっており、分数はありません。に変更すると、必ず問題が発生します。float
double
float
y
int
x
float