c语言: 编写递归函数把输入的一个负整数转换成二进制输出

如题所述

根据评论要求,改进代码:

1、函数getBCode是题目要的递归函数,实现转二进制(最高位是符号位)。

思路是十进制数绝对值除以2求余,得到反向二进制原码,反向创建链表保存结果,最终得到的单向链表就是完整二进制数原码,之后根据正负性,负数取反+1。链表头添加符号位。

2、函数freeBny为释放链表,如要重复调用函数getBCode每次调用需调用一次freeBny

3、函数showBny是打印输出,为对齐显示,按4的倍数位打印,高位补齐的位数值均与符号位一致。

#include <stdio.h>

#include <malloc.h>

#include <math.h>

typedef struct binary//成员用char类型保存数值,不是'1'或'0'的ASCII码

{

    char b;//一位二进制数0或1

    struct binary *next;


}BNY;

BNY *getBCode(int n);//获得二进制数(最高位是符号位)

void showBny(BNY *bnyHead);//对齐打印二进制数(保证是4的倍数)

void freeBny(BNY *bnyHead);//释放二进制数链表空间

int main()

{

    int n;

    BNY bny,*bnyHead=&bny;

    while(1)

    {

        printf("请输入一个整数:"),scanf("%d",&n);

        bnyHead->next=getBCode(n);

        printf("转为二进制数:"),showBny(bnyHead);

        freeBny(bnyHead);

        printf("\n");

    }

    return 0;

}

void freeBny(BNY *bnyHead)

{

    BNY *prev=NULL,*bny=NULL;

    bny=bnyHead->next;

    while(bny)

    {

        if(prev) prev->next=NULL,free(prev),prev=NULL;

        prev=bny;

        bny=bny->next;

    }

    bnyHead->next=NULL;

}

void showBny(BNY *bnyHead)

{

    int i,f=-1,len=0,n=0;

    BNY *bnySave=bnyHead;

    while(bnyHead->next)

    {

        if(f==-1) f=bnyHead->next->b;

        len++;

        bnyHead=bnyHead->next;

    }

    if(len%4)

        n=4-len%4;

    for(i=0;i<n;i++)printf("%d",f);

    bnyHead=bnySave;

    while(bnyHead->next)

    {

        printf("%d",bnyHead->next->b);

        n++;

        if(n==4)printf(" "),n=0;

        bnyHead=bnyHead->next;

    }

}

BNY *getBCode(int n)

{

    int s,y;

    static BNY*bnyPrev=NULL;

    static int cy=0,f=-1;//加1进位用

    if(f==-1 && n>=0)f=1;

    if(f==-1 && n<0)f=0,cy=1;

    n=abs(n);

    BNY *bnyNew=NULL;

    s=n/2,y=n%2;

    bnyNew=(BNY *)malloc(sizeof(BNY));

    if(!bnyNew) return NULL;

    bnyNew->b=y;

    // 如是负数,直接取反+1

    if(!f) bnyNew->b=!(bnyNew->b);//从最低位开始,负数取反

    if(cy)bnyNew->b=bnyNew->b+cy,cy=0;//负数+1

    if(bnyNew->b>1)bnyNew->b=0,cy=1;

    bnyNew->next=NULL;

    if(bnyPrev) bnyNew->next=bnyPrev;

    bnyPrev=bnyNew;

    n=s;

    if(n==0)

    {

        bnyNew=(BNY *)malloc(sizeof(BNY));//添加符号位

        if(!bnyNew) return NULL;

        if(!f)

            bnyNew->b=1;

        else

            bnyNew->b=0;

        bnyNew->next=bnyPrev;

        bnyPrev=NULL;

        cy=0,f=-1;

        return bnyNew;

    }

    return getBCode(n);

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-11-24
//试试看下面代码
void func(unsigned int x, int cnt){
if(cnt > 31)
return;
if(cnt!=0 && cnt%4 == 0){
printf(" ");
}
printf("%u", (x >> (31 - cnt)) & 0x01) ;
func(x, ++cnt);
}

int main() {
    int x =-9;
    func(x, 0);
    return 0;
}

相似回答