C语言:输出[10,20]之间所有整数的逆序二进制(一行一个输出到屏幕),咋编程

如题所述

第1个回答  2020-08-26

思路:方法不止一种,我给你写的常规思路:

一、通过与2的次方除法,可得十进制对应二进制的位数,再同高位到低位计算,将十进制数转成对应的二进制数(字符串形式)。

二、将二进制数字符串,进行倒序,就得到你要的逆序二进制数。

三、十进制转二进制,以及字符串倒序分别单独写成函数。适用其它整数。

注意:我代码中的二进制是不包含符号位。如你希望二进制最高位还要有符号,请自行修改(可判断正负后,在我的进制转换函数后面给字符串最高位插入一个符号位(可realloc函数修改动态申请的字符串数组长度))。

#include<stdio.h>

#include<malloc.h>

#include<string.h>

#include<math.h>

char *fun_10To2(int num);//10进制数字转二进制数字(字符串表示)失败返回NULL

char *invertStr(char *str);//颠倒字符串成功返回颠倒后的字符串,失败返回NULL

int main()

{

    int num=12;

    char *str=NULL;

    for(num=10;num<=20;num++,free(str),str=NULL)

    {

        str=fun_10To2(num);

        if(!str)return 1;

        printf("十机制数:%d,转二进制后为:%s\n",num,str);

        str=invertStr(str);

        printf("逆序后的二进制后为:%s\n\n",str);

    }

    return 0;

}

char *invertStr(char *str)

{

    char *p0=str,*p1=str,c;

    if(!str)return NULL;

    while(*(p1+1)!=0) p1++;//将p1指向数组最后一个字符地址

    while(p0<p1)//p0,p1分别指向字符串两头,往中间移动同时交换值

    {

        c=*p0;

        *p0=*p1;

        *p1=c;

        p0++;

        p1--;

    }

    return str;

}

char *fun_10To2(int num)

{

    double m=0;

    int b,sum=0;

    char *str=NULL,*p=NULL;

    while(1)//计算num对应二进制最多m+1位

    {

        b=(int)pow(2,m);

        sum+=b;

        if(sum>=num)

            break;

        m++;

    }

    str=(char *)malloc(sizeof(char)*(m+2));//多留一位给结束符号0

    if(!str){printf("异常!内存申请失败!\n");return NULL;}

    memset(str,0,sizeof(char)*(m+2));//字符数组填充0

    p=str;

    while(m>=0)//转二进制字符串数字

    {

        *p=num/(int)pow(2,m)+'0';

        num=num%(int)pow(2,m);

        m--;

        p++;

    }

    return str;

}

相似回答
大家正在搜