6-12 实验6_5_二进制的位数

设计递归函数int countBinary(int n); 用于将非负十进制整数n转换成二进制形式,并返回该二进制数的位数。如十进制数13的二进制形式为1101,位数为4,那么调用countBinary(13)的结果为4。

要求同学们先写出该问题的递归定义式,再设计递归函数。

输入与输出要求:
输入一个非负整数n。输出求得的结果,如输入“13”,输出“4”,占一行。

注意:此题要求递归求解,且不允许使用全局变量,其他方式不得分。

函数接口定义:
int countBinary(int n);
其中 n 是用户传入的参数。 n 的值不超过int的范围。函数的返回值为 n的二进制形式的位数。

裁判测试程序样例:
#include

int countBinary(int);

int main()
{
int n;

scanf("%d",&n);
printf("%d\n",countBinary(n));

return 0 ;

}

/* 请在这里填写答案 */
输入样例:
13
输出样例:
4

用代码块功能插入代码,请勿粘贴截图
int countBinary(int n)
{ int shu=0;
    if(n==0||n==1) return 1;
 else
 {
     shu=n%2+countBinary(n/2)*10;
 }
    
  int i =0;  
while(shu!=0)
{ i++;
 shu=shu/10;
    
}
    
  return i;  
    
    
    
    
}



shu是用来表示那个2进制的数字,我发现我求的对应二进制的数字是正确的,但是,不管怎么样,位数算出来都是2

我把循环去掉以后,改为返回shu/10,确定是除而不是取余,原本的一个二进制数1101/10后会算出1,可是这个1101应该本质上在这个程序里其实是十进制数值啊。

请帮忙找下问题,非常感谢

这是只需要返回位数的意思么?那你的代码有点多此一举,完全没有必要去计算转换出来的二进制值啊,只需要统计递归了多少次就是多少位了啊

#include <stdio.h>
int countBinary(int n)
{
    if(n==0 || n==1)
        return 1;
    return 1 + countBinary(n/2);
}

int main()
{
    int a;
    scanf("%d",&a);
    printf("%d\n",countBinary(a));
    return 0;
}

思路:
十进制转二进制:除基取余法
代码:

#include<stdio.h>
 
int countBinary(int n){
    static int num=-1;
    static int z[40]={0};
    static int i=0;
    num++;
    z[num]=n%2;
 
    if(n!=0){
        countBinary(n/2);
    }
    else
 
        for(i=num-1;i>=0;i--){
            printf("%d ",z[i]);
        }
        return num;
}
 
int main()
{
    int n=0;
    int num=0;
 
    scanf("%d",&n);
    num=countBinary(n);
    printf("\n%d\n",num);
 
 
    return 0 ;
}

1.题目里要求你不能使用全局变量,你用了全局变量;
2.你没写主函数,这个while是什么意思,不知道你是怎么运行起来的,这也有可能是导致你输出不对的原因;
3.你的方法有点多此一举了,参考一楼的回答。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

简单呀