Создать программу, которая после ввода чисел с клавиатуры, выводила бы их в разных системах счисления (а именно в 8, 10, 16)

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;

int main()
{
    int a = 5;
    float x = 2.78;
    printf("a=%o\n", a);
    printf("x=%o\n", x);
    getchar();
    return 0;
}

Вот код для 8-ричной системы счисления. На выходе получается непонятно что. В чем ошибка?


Ответы (1 шт):

Автор решения: Павел Ериков

Вот пример кода, который выводит число с плавающей точкой из 10-ричной с.с. в 8-ричную:

double number = 32.45f;
unsigned int decimal = number;        //Отделяем целую часть
number -= decimal;                    //Получаем дробную часть
int accuracy = 5;                     //Точность

std::printf("%o.", decimal);          //Выводим целую часть в 8-ричной с.с.
for (int i = 0; i < accuracy; ++i) {
    unsigned int tmp = (number *= 8); //Умножаем дробную часть на 8 и получаем целую часть
    cout << tmp;                      //Выводим целую часть
    number -= tmp;                    //Получаем дробную часть
}

Так же можно воспользоваться функцией double modf(double x, double *iptr), которая разделяет число x, занося в *iptr целую и возвращая дробную часть.

Алгоритм точно такой же:

double number = 32.45f;
double decimal;
number = modf(number, &decimal);
int accuracy = 5;

std::printf("%o.", (unsigned int) decimal);

double tmp;
for (int i = 0; i < accuracy; ++i) {
    number *= 8;
    number = modf(number, &tmp);
    cout << (unsigned int)tmp;
}

Результат выполнения программы в обоих случаях одинаковый:

40.34631
→ Ссылка