(原創) 如何印出1 2 3....10 9 8...1? (C/C++) (C)

這是我同學問我的題目,我想來想去只能寫出以下三種寫法,若有更好的寫法,請告訴我。

使用Recursive

 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /* 
 2InBlock.gif(C) OOMusou 2006 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : UpDown_Recursive.cpp
 5InBlock.gifCompiler    : Visual C++ 8.0 / ISO C++
 6InBlock.gifDescription : Demo how to use print up and down.
 7InBlock.gifRelease     : 01/14/2007 1.0
 8ExpandedBlockEnd.gif*/

 9 None.gif#include  " stdio.h "
10 None.gif
11 None.gif void  upDown( int  ,  int );
12 None.gif
13 ExpandedBlockStart.gifContractedBlock.gif int  main()  dot.gif {
14InBlock.gif  upDown(010);
15ExpandedBlockEnd.gif}

16 None.gif
17 None.gif //  n : initial value, upper : upper bound
18 ExpandedBlockStart.gifContractedBlock.gif void  upDown( int  n,  int  upper)  dot.gif {
19InBlock.gif  printf("%d ",n);
20InBlock.gif
21InBlock.gif  if (n < upper) 
22InBlock.gif    n+1 != upper ? upDown(n+1, upper) : printf("%d ",upper);
23InBlock.gif
24InBlock.gif  printf("%d ",n);
25ExpandedBlockEnd.gif}


使用while loop

 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /* 
 2InBlock.gif(C) OOMusou 2006 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : UpDown_while.cpp
 5InBlock.gifCompiler    : Visual C++ 8.0 / ISO C++
 6InBlock.gifDescription : Demo how to use print up and down.
 7InBlock.gifRelease     : 01/14/2007 1.0
 8ExpandedBlockEnd.gif*/

 9 None.gif
10 None.gif#include  " stdio.h "
11 None.gif
12 ExpandedBlockStart.gifContractedBlock.gif int  main()  dot.gif {
13InBlock.gif  // n : initail value, upper : upper bound, dir : direction
14InBlock.gif  int n = 0, upper = 10, dir = 1;
15InBlock.gif
16ExpandedSubBlockStart.gifContractedSubBlock.gif  do dot.gif{
17InBlock.gif    printf("%d ",n);
18InBlock.gif
19InBlock.gif    dir ? ++n : --n;
20InBlock.gif    n == upper ? dir = 0 : 1;
21InBlock.gif
22ExpandedSubBlockEnd.gif  }
 while(n+1);
23ExpandedBlockEnd.gif}


執行結果

None.gif 0   1   2   3   4   5   6   7   8   9   10   9   8   7   6   5   4   3   2   1   0  請按任意鍵繼續 . . .


Recursive效率不好,所以就不談了,若用while()寫,目前看起來還須多動用到一個變數指定方向,有沒有辦法省掉一個變數呢?我本來也以為這應該是最簡單的寫法了,但後來靈機一動,想到目前用到的都是程式的解法,若用數學來解呢?可否想辦法找出一個公式呢?

以下是用數學的方式來解:

 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /* 
 2InBlock.gif(C) OOMusou 2006 http://oomusou.cnblogs.com
 3InBlock.gif
 4InBlock.gifFilename    : UpDown_Math.cpp
 5InBlock.gifCompiler    : Visual C++ 8.0 / ISO C++
 6InBlock.gifDescription : Demo how to use print up and down.
 7InBlock.gifRelease     : 01/14/2007 1.0
 8ExpandedBlockEnd.gif*/

 9 None.gif#include  " stdio.h "
10 None.gif
11 ExpandedBlockStart.gifContractedBlock.gif int  main()  dot.gif {
12InBlock.gif  // n : initail value, upper : upper bound
13InBlock.gif  int n = 0, upper = 10;
14InBlock.gif
15ExpandedSubBlockStart.gifContractedSubBlock.gif  do dot.gif{
16InBlock.gif    printf("%d ", n <= upper ? n++ : 2 * upper -n++);
17ExpandedSubBlockEnd.gif  }
 while(n <= 2 * upper);
18ExpandedBlockEnd.gif}


我用以下的方式歸納出一個公式
0 1 2 3 2 1 0
0 1 2 3 4 5 6

n=0 n 
n=1 n 
n=2 n 
n=3 n
n=4 upper -1 = upper - (n-upper) = 2 * upper -n
n=5 upper -2 = upper - (n-upper) = 2 * upper -n
n=6 upper -3 = upper - (n-upper) = 2 * upper - n

s = n                     if n <= upper
s = 2 * upper -n    otherwise

這樣子就可不需另外一個變數,且一層while()就可解決了。

這個例子告訴我們,要對程式最佳化,數學仍是最終極的武器,所以師長們說的很對,程式要寫的好,數學一定要好,我要好好的學數學了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值