| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 998 人关注过本帖
标题:奥赛的一道题,,各位看看怎么做
只看楼主 加入收藏
密码code
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-8-12
收藏
 问题点数:0 回复次数:8 
奥赛的一道题,,各位看看怎么做
4.#include <stdio.h>
void digit(long n,long m)
{if(m>0)
printf("%2ld",n%10);
if(m>1)
digit(n/10,m/10);
printf("%2ld",n%10);
}
main()
{long x,x2;
printf("Input a number:\n"); scanf("%ld",&x);
x2=1;
while(x2<x) x2*=10;
x2/=10;
digit(x,x2);
printf("\n");
}
输入:9734526
输出:______________________________



答案是 6 2 5 4 3 7 9 9 7 3 4 5 2 6(数字之间无空格扣2分)

但我觉得输出应该是6,m>1明明不成立,怎么出来的这么一串数。谁能帮忙解释一下?
搜索更多相关主题的帖子: 奥赛 
2008-08-13 17:35
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
貌似这个题当年我做过了,而且当年马虎一下做错了,我的8分就这样没有了~55555555

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-08-13 17:39
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
[bo][un]密码code[/un] 在 2008-8-13 17:35 的发言:[/bo]

4.#include  
void digit(long n,long m)
{if(m>0)
printf("%2ld",n%10);
if(m>1)
digit(n/10,m/10);
printf("%2ld",n%10);
}
main()
{long x,x2;
printf("Input a number:\n"); scanf("%ld",&x) ...


主调函数digit(x,x2)中的x=9734526,x2=1000000,所以m应该是100000才是呀,怎么m>1会不成立呢!
2008-08-13 18:42
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
1.--------------------------------------
.#include <stdio.h>
void digit(long n,long m)  //n=9734526   m=1000000
{if(m>0)
printf("%2ld",n%10); //条件成立,输出n%10值,n%10=6
if(m>1)             //条件成立
digit(n/10,m/10);   //递归调用函数 n与m值均除以10
printf("%2ld",n%10);
}

2。----------------------------------------
.#include <stdio.h>
void digit(long n,long m)  //n=973452  m=100000
{if(m>0)
printf("%2ld",n%10); //条件成立,输出n%10值,n%10=2
if(m>1)             //条件成立
digit(n/10,m/10);   //递归调用函数 n与m值再除以10
printf("%2ld",n%10);

3。----------------------------
.#include <stdio.h>
void digit(long n,long m)  //n=97345   m=10000
{if(m>0)
printf("%2ld",n%10); //条件成立,输出n%10值,n%10=5
if(m>1)             //条件成立
digit(n/10,m/10);   //递归调用函数 n与m再次除以10
printf("%2ld",n%10);

4。--------------------------------------
.#include <stdio.h>
void digit(long n,long m)  //n=9734   m=1000
{if(m>0)
printf("%2ld",n%10); //条件成立,输出n%10值,n%10=4
if(m>1)             //条件成立
digit(n/10,m/10);   //递归调用函数 n与m再次除以10
printf("%2ld",n%10);

5。------------------------------------
.#include <stdio.h>
void digit(long n,long m)  //n=973   m=100
{if(m>0)
printf("%2ld",n%10); //条件成立,输出n%10值,n%10=3
if(m>1)             //条件成立
digit(n/10,m/10);   //递归调用函数 n与m再次除以10
printf("%2ld",n%10);

6。-----------------------------------------
.#include <stdio.h>
void digit(long n,long m)  //n=97   m=10
{if(m>0)
printf("%2ld",n%10); //条件成立,输出n%10值,n%10=7
if(m>1)             //条件成立
digit(n/10,m/10);   //递归调用函数 n与m再次除以10
printf("%2ld",n%10);

7。-----------------------------------
.#include <stdio.h>
void digit(long n,long m)  //n=9  m=1
{if(m>0)
printf("%2ld",n%10); //条件成立,输出n%10值,n%10=9
if(m>1)             //条件不成立
digit(n/10,m/10);   
printf("%2ld",n%10); //输出n%10值 n%10=9

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
现在输出的是6 2 5 4 3 7 9 下面的是关键——其实我的理解也不完全正确,还希望高人来解答。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8。因为是递归算法,就应用到了“栈”,当递归结束时,本着先进后出的栈的规则,要把数据再传回函数的参数,所以,9734526这几个数据被倒退着返回参数,然后并打印出来,所以有了 9 7 3 4 5 2 6 6 2 5 4 3 7 9 这样的结果。




****************************************************

以上只是一家之言,谨作参考。如有不对之处,还望高手更正,谢谢。
2008-08-14 02:43
陈豪俊
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-8-1
收藏
得分:0 
void digit(long n,long m)
{if(m>0)
printf("%2ld",n%10);
if(m>1)
digit(n/10,m/10);
printf("%2ld",n%10);
}
在主函数中n=9734526,m=1000000
第一次调用的结果是:输出6 输出调用digit(973452,100000)的结果 输出6;
调用digit(973452,100000)的结果是:输出2 输出调用digit(97345,10000)的结果 输出2;
调用digit(97345,10000)的结果是:输出5 输出调用digit(9734,1000)的结果 输出5;
调用digit(9734,1000)的结果是:输出4 输出调用digit(973,100)的结果 输出4;
调用digit(973,100)的结果是:输出3 输出调用digit(97,10)的结果 输出3;
调用digit(97,10)的结果是:输出7 输出调用digit(9,1)的结果 输出7;
调用digit(9,1)的结果是:输出9 if(m>1)不成立,递归调用结束 输出9;
由于输出格式为%21d,所以要有空格
所以结果是62543799734526
不知道这样的翻译是否能令楼主茅塞顿开
2008-08-14 10:11
密码code
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-8-12
收藏
得分:0 
哦,是不是这段while(x2<x) x2*=10;x2/=10; 是先把x2算到10000000再除10呀

我以开始以为这段是这样理解那(
while(x2<x)
{x2*=10;
x2/=10; }
2008-08-14 12:40
密码code
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-8-12
收藏
得分:0 
对了,多谢各位!!
2008-08-14 12:42
paherdin
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-8-14
收藏
得分:0 
2008-08-14 13:45
w362034710
Rank: 1
等 级:新手上路
帖 子:169
专家分:0
注 册:2006-12-2
收藏
得分:0 
很好的题,。。
2008-08-14 14:43
快速回复:奥赛的一道题,,各位看看怎么做
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016213 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved