这函数有没更好的写法?

yeyaox 2011-10-31 08:25:03
int calcDigits(int dec, int *digits)
{
if ((dec = dec / 2) > 0){
++(*digits);
dec = calcDigits(dec, digits);
}
else
return (*digits + 1);
}

在传入参数时digits要先赋0值的, 但我又不想定义全局变量或用#define, 有没其它方法? 或者更好的写法?
...全文
99 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
vilnies 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gdujian0119 的回复:]
楼主这函数作用貌似是求数dec的二进制表示时最大次方的指数。可以这么实现:

C/C++ code
int calcDigits(int dec)
{
int n = 0;
while(dec != 0) {
dec = dec>>1;
++n;
}
return……
[/Quote]
有可能会死循环的
yeyaox 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gdujian0119 的回复:]

楼主的判断条件使用dec>0会有问题,dec定义为int的,即dec可为负值,那么第一次调用即退出。
[/Quote]
calcDigits(int dec)
{
if( 0 == dec) {
return 0;
}
return calcDigits(dec>>1) + 1;
}

少少问题, 这样完美了,你的方法最简单,最好,谢谢!
孤独小剑 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 vilnies 的回复:]

引用 10 楼 gdujian0119 的回复:
楼主这函数作用貌似是求数dec的二进制表示时最大次方的指数。可以这么实现:

C/C++ code
int calcDigits(int dec)
{
int n = 0;
while(dec != 0) {
dec = dec>>1;
++n;
}
return……

有可能会死循环的
[/Quote]不可能会死循环,无论你输入多大的数,不信自己试试……
孤独小剑 2011-10-31
  • 打赏
  • 举报
回复
楼主的判断条件使用dec>0会有问题,dec定义为int的,即dec可为负值,那么第一次调用即退出。
孤独小剑 2011-10-31
  • 打赏
  • 举报
回复
楼主这函数作用貌似是求数dec的二进制表示时最大次方的指数。可以这么实现:
int calcDigits(int dec)
{
int n = 0;
while(dec != 0) {
dec = dec>>1;
++n;
}
return n;
}
若使用楼主的递归方法:
calcDigits(int dec)
{
if( 0 == dec) {
return 1;
}
return calcDigits(dec>>1) + 1;
}
若依楼上的说在函数内部定义个static变量存储这样会有问题,第一次调用此函数没错,但第二次调用时有错误,会累加上一次的值。以上代码为手工,可能编译会用问题,楼主掂量下。
vilnies 2011-10-31
  • 打赏
  • 举报
回复
楼主当dec>1时,你的函数不是没返回值了吗?
int calDigits(int dec)
{
int rs =1;
for(;rs<(1<<(sizeof(int) +1));rs++)
{
if( (dec>>rs) == 0)
break;
}
return rs;
}
fbling11 2011-10-31
  • 打赏
  • 举报
回复
不好意思上面两个都有错误,改正一下哈。
int calcDigits(int dec)
{
static int digits = 0;
int temp;
if ((dec = dec / 2) > 0){
++digits;
dec = calcDigits(dec);
}
else
{
temp = digits;
digits = 0;
return (temp + 1);
}
}

如果你每次调用都是digits=0的话,可以考虑这种用法静态变量。
fbling11 2011-10-31
  • 打赏
  • 举报
回复
int calcDigits(int dec)
{
static int digits = 0;
if ((dec = dec / 2) > 0){
++digits;
dec = calcDigits(dec);
}
else
{
digits = 0;
return (digits + 1);
}
}

如果你每次调用都是digits=0的话,可以考虑这种用法静态变量。
fbling11 2011-10-31
  • 打赏
  • 举报
回复
int calcDigits(int dec)
{
static int digits = 0;
if ((dec = dec / 2) > 0){
++digits;
dec = calcDigits(dec, digits);
}
else
{
digits = 0;
return (digits + 1);
}
}

lengxujun 2011-10-31
  • 打赏
  • 举报
回复
int countb1s(int dec)
{
int n = 0;

while (dec)
{
n++;
dec &= (dec - 1);
}

return n;
}
火龙 2011-10-31
  • 打赏
  • 举报
回复
用缺省参数行不?如果有digits输入那么就用输入的值,没有输入的话就是默认的NULL。

int calcDigits(int dec, int *digits=NULL)
{
if ((dec = dec / 2) > 0){
++(*digits);
dec = calcDigits(dec, digits);
}
else
return (*digits + 1);
}


lengxujun 2011-10-31
  • 打赏
  • 举报
回复
int calcDigits(int dec, int &digits)
{
digits = 0;
while (dec)
{
digits++;
dec &= (dec - 1); // 将最右边的'1'比特位清0
}
return digits;
}
yeyaox 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jietoulangren 的回复:]

C/C++ code

int calcDigits(int dec, int &digits)
{
if ((dec = dec / 2) > 0){
++digits;
dec = calcDigits(dec, digits);
}
else
……
[/Quote]
引用还没用过, 我直接COPY你的代码, 这是源码,但出现在编译错误, 网上搜刮了一阵找不到原因
#include <stdio.h>
main()
{
int decimal;
int &digits = 0;

scanf("%d", &decimal);
digits = calcDigits(decimal, digits);
printf("%d\n", digits);
return 0;

}
int calcDigits(int dec, int &digits)
{
if ((dec = dec / 2) > 0){
++digits;
dec = calcDigits(dec, digits);
}
else
return (digits + 1);
}
~


printAsBinary_e2.c: In function ‘main’:
printAsBinary_e2.c:5:13: error: expected identifier or ‘(’ before ‘&’ token
printAsBinary_e2.c:8:9: error: ‘digits’ undeclared (first use in this function)
printAsBinary_e2.c:8:9: note: each undeclared identifier is reported only once for each function it appears in
printAsBinary_e2.c: At top level:
printAsBinary_e2.c:13:29: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token


请问是什么问题?
JieTouLangRen 2011-10-31
  • 打赏
  • 举报
回复

int calcDigits(int dec, int &digits)
{
if ((dec = dec / 2) > 0){
++digits;
dec = calcDigits(dec, digits);
}
else
return (digits + 1);
}

引用也可以~

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧