使用while循环递归的十进制到二进制转换

时间:2014-02-22 06:19:31

标签: c binary

我的二进制转换在第二次重复后不起作用,它似乎只在第一次通过时起作用。用户输入的目的是从一个整数转换为十六进制,八进制和百分比的数字,并继续询问和转换,直到用户输入0.请帮忙!

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

long toBinary(int);

int main(void) {
    int number = 0;
    long bnum;   
    int zero = 0;

    while(number != zero) {
        puts("\nPlease enter a number you would like to convert to");
        puts("\nHexadecimal, octal, and binary: ");
        scanf("%d", &number);

        if(number != zero) {
            printf("\nThe Hexadecimal format is: %x", number);
            printf("\nThe Octal format is: %o", number);
            bnum = toBinary(number);
            printf("\nThe binary format is: %ld\n", bnum);
        }
        else {
            puts("\nI'm sorry you have to enter a number greater than 0.\n");
            puts("\nOr have enter an invalid entry.");

        }
    }
    return 0;
}   

long toBinary(int number) {
    static long bnum, remainder, factor = 1;
    int long two = 2;
    int ten = 10;

    if(number != 0) {
        remainder = number % two;
        bnum = bnum + remainder * factor;
        factor = factor * ten;
        toBinary(number / 2);
    }
    return bnum;
}       

3 个答案:

答案 0 :(得分:1)

您只需要一个函数将整数转换为二进制表示。

假设int是32位,那么这应该有效:

#include <stdio.h>

int main()
{
    char str[33];
    str[32] = 0;
    int x = 13, loop;
    for (loop = 31; loop >= 0; --loop) {
       str[loop]  = (x & 1) ? '1' : '0';
       x = x >> 1;
    }
    printf("As %s\n", str);
    return 0;
}

你可以将它变成一个函数,读取x等...

修改

对于八进制/十六进制 - printf将为您执行此操作

修改

这里递归

#include <stdio.h>

void PrintBinary(int n, int x) {
   if (n > 0) {
      PrintBinary(n - 1, x >> 1);
   }
   printf("%c",(x & 1) ? '1' : '0');
}

int main()
{
   PrintBinary(32,12);
   return 0;
}

答案 1 :(得分:0)

首先,我很惊讶它甚至可以工作一次。首先,你的while条件是while数字不等于零。但是刚刚结束,数字等于0,零等于0.因此,应该永远不会运行。如果你想为主循环保持这个条件,可以将它改为do-while循环:执行{// code} while(number!= 0); 。这将至少运行一次代码,然后检查输入的数字是否不等于零。这让我想到了下一个问题;你的scanf号码是扫描双倍并将其放在一个常规的整数记忆点。快速修复: scanf(“%i”,&amp; number); 。此外,我发现了一些名为puts的函数..我发现最好保留一个打印功能printf。现在,我在你的toBinary函数中发现了一些错误,但如果它有效,我认为它可行。这些都是我能找到的错误,我希望这有帮助。但是为了将来参考,不需要为此级别的2或10等常数声明变量。

答案 2 :(得分:0)

#include <stdint.h>

char* toBinary(int32_t number, int index){
    static char bin[32+1] = {0}, *ret;
    if(index == 32){
        memset(bin, '0', 32);
        return toBinary(number, 31);
    } else if(number & (1<<index))
        bin[31-index] = '1';

    if(index)
        (void)toBinary(number, index-1);
    else
        for(ret = bin; *ret == '0';++ret);

    return ret;
}

...
int number = -1;
...
printf("\nThe binary format is: %s\n", toBinary(number, 32));