用递归将十进制转二进制的问题

feng2222 2010-11-13 09:57:42
我自己编写的
#include "stdio.h"
int f(int n)
{int r;
if (n>0) r=n%2;
return r;}
main()
{ int n;
int a;
scanf("%d",&n);
while(n!=0)
{a=f(n);
n=n/2;
printf("%d",a);}
getch();
}
答案
#include "stdio.h"
fun(int n)
{
int i,k;
while(1)
{
i=n%2;
k=n/2;
if(k>0) fun(k);
{
printf("%d",i);
break ;
}
}
}
void main()
{
int m;
printf("请输入十进制数m的值:");
scanf("%d",&m);
fun(m);
printf("\n");
getch();
}
例如我自己编的输入123,就输出1101111;
答案那个就输出1111011;


我想问下自己编的和答案的区别在哪里,为什么其输出的是倒过来的。

还有答案中 {
printf("%d",i);
break ;
}
是实现什么功能?

初学c语言,也许问的很菜鸟,希望懂的人可以花的时间帮忙解答下,谢谢。
...全文
619 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
include_int_float 2010-11-13
  • 打赏
  • 举报
回复
其实c语言中,非0包括正数,while()括号中可以是其他数,如2,3,4,5,6。。。。。。
c的逻辑运算中,以1代表真,0代表假,例子:5>0 得出的结果是假,则输出的结果以0代表。
而换种思想来说,要判断一个量是真还是假,就是非0为真,0为假
include_int_float 2010-11-13
  • 打赏
  • 举报
回复
其实c语言中,非0包括正数,while()括号中可以是其他数,如2,3,4,5,6。。。。。。
feng2222 2010-11-13
  • 打赏
  • 举报
回复
while(1)不是很懂,不是指非0或者是真的时候执行循环吗,那非0指的是哪个参数,或者为真是指哪个条件呢?[Quote=引用 16 楼 include_int_float 的回复:]
不是的,while(1)使这个语句一直循环下去,不会停止,可以说是个死循环。
这时bleak起到的作用是跳出循环语句。
而程序中它遇到if时,又调用fun语句,而后头的{printf("%d",i);break ;}的函数一直留到最后k<=0时,才执行了{printf("%d",i);break ;}函数,才把i逐渐一个一个的输出出来。相当于i从最后排到前面,而你的程序是从前面排到最后。区别在……
[/Quote]
include_int_float 2010-11-13
  • 打赏
  • 举报
回复
bleak是从后一个循环跳到前一个循环。
[Quote=引用 15 楼 feng2222 的回复:]
引用 11 楼 csuxiaowu 的回复:
C/C++ code
fun(int n)
{
int i,k;
i=n%2;
k=n/2;
if(k>0) fun(k);//第一次的时候 k = 61 还没执行下面的打印语句 就会回到上面去执行去了 这才是递归
pritf("%d",i);
}
这样说基本懂了,到k非>0才执行printf,但是printf后就是break(中止……
[/Quote]
feng2222 2010-11-13
  • 打赏
  • 举报
回复
很谢谢大家热情和有耐心的帮助,接着还是让我自己去好好消化下,谢谢大家。
include_int_float 2010-11-13
  • 打赏
  • 举报
回复
不是的,while(1)使这个语句一直循环下去,不会停止,可以说是个死循环。
这时bleak起到的作用是跳出循环语句。
而程序中它遇到if时,又调用fun语句,而后头的{printf("%d",i);break ;}的函数一直留到最后k<=0时,才执行了{printf("%d",i);break ;}函数,才把i逐渐一个一个的输出出来。相当于i从最后排到前面,而你的程序是从前面排到最后。区别在于此。

[Quote=引用 13 楼 feng2222 的回复:]
因为递归是刚学,可能理解的不是很深,我们学的时候是不满足条件的时候赋给它一个值,然后通过这个值推出之前的,那你说的输出后跳出循环,是不是指不满足的时候,那这样不是才只有跳出循环这部有输出,那就只有输出一个余数而已了

引用 12 楼 include_int_float 的回复:
标准答案的{
printf("%d",i);
break ;
}
是函数的递归调用,是输出i后,再跳出循环……
[/Quote]
feng2222 2010-11-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 csuxiaowu 的回复:]
C/C++ code
fun(int n)
{
int i,k;
i=n%2;
k=n/2;
if(k>0) fun(k);//第一次的时候 k = 61 还没执行下面的打印语句 就会回到上面去执行去了 这才是递归
pritf("%d",i);
}
[/Quote]这样说基本懂了,到k非>0才执行printf,但是printf后就是break(中止),这样不就只输出一个余数,就中止了吗?
include_int_float 2010-11-13
  • 打赏
  • 举报
回复
#5楼 得分:0回复于:2010-11-13 22:08:28fun(int n)
{
int i,k;
i=n%2;
k=n/2;
if(k>0) fun(k);
pritf("%d",i);
}
//这样也可以。
他的代码是正确的,它属于函数的嵌套调用。是到if语句时继续执行fun()的调用,到最后的k<=0时,才回去前面的函数步骤,直达结束为止
feng2222 2010-11-13
  • 打赏
  • 举报
回复
因为递归是刚学,可能理解的不是很深,我们学的时候是不满足条件的时候赋给它一个值,然后通过这个值推出之前的,那你说的输出后跳出循环,是不是指不满足的时候,那这样不是才只有跳出循环这部有输出,那就只有输出一个余数而已了[Quote=引用 12 楼 include_int_float 的回复:]
标准答案的{
printf("%d",i);
break ;
}
是函数的递归调用,是输出i后,再跳出循环。
[/Quote]
include_int_float 2010-11-13
  • 打赏
  • 举报
回复
标准答案的{
printf("%d",i);
break ;
}
是函数的递归调用,是输出i后,再跳出循环。
Csuxiaowu 2010-11-13
  • 打赏
  • 举报
回复
fun(int n)
{
int i,k;
i=n%2;
k=n/2;
if(k>0) fun(k);//第一次的时候 k = 61 还没执行下面的打印语句 就会回到上面去执行去了 这才是递归
pritf("%d",i);
}
feng2222 2010-11-13
  • 打赏
  • 举报
回复
那答案中那个不是和我的也是同个道理吗?也是第一次取余就打印出来啦,[Quote=引用 9 楼 sparrow081 的回复:]
一点数学的问题啦

你代码中的 f() 返回的是 n % 2, 也就是对 n 除以 2 取余。 也就是说 取的 是最低位的。
比如 n=123, 第一次取到的 是 123 % 2, 这个是最低位的, 然后 f(n) 返回它, 然后你把它打印出来。
下一次 n = 123/2, f(n) 返回的是 n % 2, 这是第二地位的啦, 但是你这时已经把它打印在前面的那个之后了。
[/Quote]
sparrow081 2010-11-13
  • 打赏
  • 举报
回复
一点数学的问题啦

你代码中的 f() 返回的是 n % 2, 也就是对 n 除以 2 取余。 也就是说 取的 是最低位的。
比如 n=123, 第一次取到的 是 123 % 2, 这个是最低位的, 然后 f(n) 返回它, 然后你把它打印出来。
下一次 n = 123/2, f(n) 返回的是 n % 2, 这是第二地位的啦, 但是你这时已经把它打印在前面的那个之后了。
feng2222 2010-11-13
  • 打赏
  • 举报
回复
假如n=123;
i=1
k=61,
然后就输出i了,它的逻辑其实不也和我的一样,顺着求出余数吗,那它怎么实现逆着输出这些余数呢。[Quote=引用 5 楼 lthyxy 的回复:]
fun(int n)
{
int i,k;
i=n%2;
k=n/2;
if(k>0) fun(k);
pritf("%d",i);
}
//这样也可以。
[/Quote]
Csuxiaowu 2010-11-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 feng2222 的回复:]

那假如不是使用递归,要如何做呢引用 4 楼 csuxiaowu 的回复:
fun(int n)
{
int i,k;
while(1)
{
i=n%2;
k=n/2;
if(k>0) fun(k);
{
printf("%d",i);
break ;
}
}
}
因为递归 所以才使得后面求得的余数先输出
[/Quote]
先保存起来
feng2222 2010-11-13
  • 打赏
  • 举报
回复
那假如不是使用递归,要如何做呢[Quote=引用 4 楼 csuxiaowu 的回复:]
fun(int n)
{
int i,k;
while(1)
{
i=n%2;
k=n/2;
if(k>0) fun(k);
{
printf("%d",i);
break ;
}
}
}
因为递归 所以才使得后面求得的余数先输出
[/Quote]
liutengfeigo 2010-11-13
  • 打赏
  • 举报
回复
fun(int n)
{
int i,k;
i=n%2;
k=n/2;
if(k>0) fun(k);
pritf("%d",i);
}
//这样也可以。
Csuxiaowu 2010-11-13
  • 打赏
  • 举报
回复
fun(int n)
{
int i,k;
while(1)
{
i=n%2;
k=n/2;
if(k>0) fun(k);
{
printf("%d",i);
break ;
}
}
}
因为递归 所以才使得后面求得的余数先输出
feng2222 2010-11-13
  • 打赏
  • 举报
回复
它花括号不是代表一些语句的集合吗,按它那样不是等到跳出那一步才输出i?
liutengfeigo 2010-11-13
  • 打赏
  • 举报
回复
你仔细想想你代码的逻辑吧,你的代码确实是输出相反的。
加载更多回复(1)

70,023

社区成员

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

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