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;
}
EDIT
1701 = 0x6A5 = 0b011010100101
так что если вы группа двоичное число в четвереньках вы можете увидеть шестнадцатеричное значение (начиная с права)
0110 1010 0101 = 0x6A5
если вы разбиваете его на группы по три, вы видите восьмеричный
011 010 100 101 = 03245
и вы можете увидеть, как последнее решение, которое я показал работы, лавировать нуль на каждом из этих
011 010 100 101
0011 0010 0100 0101
и вы получите 0x3245
, именно то, что вы делали с базой 10, но с базой 16 вместо этого, и использовали оптимизацию использования смен и масок.
EDIT 2
понять, сколько происходит в этой одной строке кода (предположим, что х и у ИНТ)
y = y + (x%8)*pow(10,n);
первого порядка от операций. компилятор приветствуется и должен делать по модулю первый результат в int
. Следующий порядок операций, скобки, устранит все сомнения. умножение следующего, но один операнд - double (pow)
, поэтому результат модуляции должен быть повышен до double
. и происходит двойное умножение. теперь у вас есть добавка одна сторона int
другая double
. поэтому этому y присваивается значение double
, тогда происходит добавление double
, а double
- int
- хранится в y
. Если вы посмотрите на мой первый более простой пример, сделав n go 1, 10, 100, 1000
и т. Д. Как int
, тогда нет double
, он остается int
все время.
если вы сделаете y
в float
, то добавляемая float + double
так y
должен быть повышен до двойной, двойной добавить бывает, как и раньше, но теперь для хранения в левой части равенства, как float
, у вас есть преобразование double
в float
, которое позволяет округлять. поэтому каждый раз через петлю вы разрешаете небольшую долю земли в y
. проблема здесь, по крайней мере, с вашими примерами, я не вижу фракций, которые формат с плавающей запятой не может обрабатывать. модуль должен быть выполнен как int
, и фракции нет. если вы измените x
на float
, тогда убедитесь, что у вас возникнут проблемы.
Усечение и ошибка с плавающей точкой. –
Что я хочу знать, шаг за шагом, как усечение десятичных знаков дает мне 1 меньше, чем предполагаемый ответ. Я не знаю, почему люди голосуют за мой вопрос. –
Ваш 'pow (10, n)' не предоставляет ожидаемые ответы _exact_. Добавьте 'printf ("%.20e% d \ n ", pow (10, n), (int) pow (10, n)),' в цикл, чтобы увидеть неожиданное. – chux