Отображение индивидуального номера с интервалом на принтф - PullRequest
0 голосов
/ 03 февраля 2019

я пишу код, который покажет, что результат должен отображать отдельные цифры и десятичный эквивалент.Например, если n равно 6 и введено число 110011, распечатка будет 1 1 0 0 1 1 Десятичный эквивалент 51

Я уже получил и отредактировал код, однако он показывает "110011 110011110011 110011 110011 110011 "вместо" 1 1 0 0 1 1 ".

#include <math.h>

void main()
{
    int  num, binary, decimal = 0, base = 1, remainder, n, digits;

    printf("Please enter the number of digits:\n");
    scanf("%d", &n);

    printf("Please enter the %d digits:\n",n);
    scanf("%d", &num);
    binary = num;
    while (n > 0)
    {
        remainder = num % 10;
        decimal = decimal + remainder * base;
        num = num / 10 ;
        base = base * 2;
        printf("%d   ", binary);
        n--;
    }

    printf("\nIts decimal equivalent is = %d \n", decimal);
}



Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

Причина, по которой вы получаете этот вывод, заключается в том, что каждый вызов printf("%d ", binary); выводит на экран всю «двоичную» переменную, и эта переменная содержит число, а не отдельные цифры этого числа.

Самый простой способ получить доступ к определенным цифрам числа - сначала разделить его на некоторую степень 10, а затем получить mod10 этого числа, например:

int number = 6543;
int lastDigit = number % 10;
int secondLastDigit = (number / 10) % 10;
int thirdLastDigit = (number / 100) % 10;

Это работает, потому что деление целых чисел в C приводит клюбые дробные части должны быть пропущены, поэтому, если вы разделите 6543/10 (как в примере), вы не получите 654,3, но 654.

Вы можете создать функцию, которая будет возвращатьцифра числа из любой позиции, например, так:

int digitAt(int num, int pos)
{
    // Divide num by 10^(pos - 1) to "shift" the number to the right
    num /= pow(10, pos - 1);

    // Return the last digit after the divisions
    return num % 10;
}

Приведенная выше функция возвращает цифры, начинающиеся справа (pos 1 = последняя цифра, pos 2 = вторая последняя цифра)! Чтобы сделатьэта функция более интуитивно понятна, например, вы можете перевернуть число по горизонтали перед делением (123 становится 321).

Я немного коснулся, вернувшись к исходной вершинеIC.Чтобы достичь желаемой функциональности, вы можете написать свой код следующим образом (только цикл while):

while (n > 0)
{
    remainder = num % 10;
    decimal = decimal + remainder * base;
    num = num / 10 ;
    base = base * 2;
    int binaryDigit = (binary / pow(10, n - 1)) % 10;
    printf("%d   ", binaryDigit);
    n--;
}

Теперь причина, по которой вам не нужно беспокоиться о том, что ваши цифры читаются в обратном направлении (как впредыдущий пример функции) потому, что удобно, ваш итератор, n, уже идет в обратном направлении («от n до 0» вместо «от 0 до n»), поэтому вы читаете крайние левые цифры передсамые правые.

Надеюсь, что это помогло.

[EDIT] Как указано в ответах, использование pow () в целочисленных операциях может привести к нежелательным результатам.Виноват.Существует множество способов достижения целочисленной степени 10, хотя такая функция, как

int powerOf10(int exp)
{
    int num = 1;
    while (exp > 0) {
        num *= 10;
        exp--;
    }

    return num;
}

, должна выполнять эту работу.

0 голосов
/ 03 февраля 2019

Проблема в том, что вы делаете:

printf("%d   ", binary);

, но binary всегда одно и то же значение, то есть оно никогда не меняется, поэтому вы печатаете исходное значение снова и снова.

Если вы измените его на:

printf("%d   ", remainder);

, все будет "немного лучше", так как двоичный шаблон будет напечатан , но в обратном порядке .Так что это не решение.

Так что вместо этого вы можете собирать значения в цикле и сохранять их в строке, которая будет напечатана после цикла.Нравится:

int main()
{
    int  num, decimal = 0, base = 1, remainder, n;

    printf("Please enter the number of digits:\n");
    scanf("%d", &n);

    int idx = 2*n-1;
    char *str = malloc(2*n);  // Allocate memory for the string
    str[idx--] = 0;           // and zero-terminate it

    printf("Please enter the %d digits:\n",n);
    scanf("%d", &num);

    while (n > 0)
    {
        remainder = num % 10;
        decimal = decimal + remainder * base;
        num = num / 10 ;
        base = base * 2;
        str[idx--] = '0' + remainder;  // Put the "binary" (i.e. '0' or '1') char in the string
        if (idx>0) str[idx--] = ' ';   // Put a space in the string
        n--;
    }

    printf("%s", str);                 // Print the string
    printf("\nIts decimal equivalent is = %d \n", decimal);

    free(str);    // Free the string

    return 0;
}
0 голосов
/ 03 февраля 2019

Значение в переменной binary становится копией значения в переменной num в следующей строке.

binary = num;

Поскольку впоследствии оно никогда не изменяется, оно всегда останется неизменнымvalue, копия значения в num в тот момент, когда оно было скопировано (см. строчку кода выше).
Ваш цикл выполняется n раз (в вашем примере шесть раз).
Каждый разчерез цикл то же скопированное значение печатается в следующей строке кода.Таким образом, исходное значение будет напечатано шесть раз в вашем примере.

printf("%d   ", binary);

Вы на самом деле не задавали вопрос (который действительно рекомендуется здесь, в StackOverflow).
Поэтому я ответил на вопрос «Почемуодно и то же значение напечатано шесть раз? "

Возможно, вы захотите задать следующий вопрос:" Как получить желаемый результат? "
На этот вопрос ответить гораздо сложнее, поскольку ваш код довольно далекоот достижения этого.

Вы должны будете определять двоичные цифры по одной и в правильном порядке.
Вы действительно определяете цифры по одной вокруг следующей строки в вашем коде.

remainder = num % 10;

Но это неправильный порядок, он дает вам цифры от наименее значащего до наиболее значащего.Попробуйте ввести «100011», чтобы понять, что я имею в виду.

Чтобы быть более точным, я должен сказать, что я думаю, что вы хотите, чтобы цифры были от большинства к наименьшему, но, возможно, нет, в этом случае этопроще: выведите remainder вместо binary.

Если я прав, а вы хотите меньше всего, тогда вам нужно каким-то образом поменять цифры.Вы можете использовать стек, массив, рекурсию или другую (более сложную) математику для определения количества цифр.

...