游记(2)

这些提示来自 《 从问题到程序 - 程序设计与C语言引论》 第二版 裘宗燕 ^_^

0 循环结构一般不要用浮点数进行计数,不能保证一定会循环预想的次数;

1 框架到细节的设计程序,不论是大程序还是小程序,有效分解复杂度;

2 求 200 内的平方数的方法

void solution ( )  {
        for  (int m = 1; m * m <= 200 ;  m++)  
              printf("%d
",m * m);
}

 

/* 有如下公式
 a1 = 1;
 an = an-1 + 2n+1;

*/

void solution ()  {
       int a1 = 1;
       for  ( int i = 0 ;an + 2 * i +  1 )  <= 200; i++)  {
                printf("%d", an + 2 * i + 1 );
                an = an + 2 * i + 1;
       }
}

3 小龟爬爬问题,第1秒 1/1 m, 第2秒 1/2 m, 第3秒 1/4 m,1小时能爬多少米?爬20 米要多久?

double solution1 (int n)  {

     int sum = 0;

     for ( i = 1; i <= n ; i++) 

         sum += 1 / (float)i;

     return sum;

}

int result = solution (3600);

printf  ("%d ", result);

int solution2  (double n)  {

         long i;                   //i think int i also OK.

         double n = 0.0 ;

         for  ( i = 0; n < 20; i ++)  

             n += 1 / (float) i;

        return i - 1;

 }

4  为程序计时,借助 time.h 中的 clock 函数

clock() / CLOCKS_PER_SEC   

得到程序运行开始到此刻的时间,单位是 秒 (s),不要直接输出 clock( ) 返回值。

多说一句,这个测试在学习算法的时候用得上,其实得到的是一个long int 数值,需要强制转化为 double。

5  斐波那契数列

效率低解法:

long fib  (int n)  {

      if  ( n <=0 ) return -1;

      if ( n == 1 || n == 2)  

             return 1;

      else

             return  fib ( n - 1 ) +fib ( n - 2);

}

来个好方法:

long fib (int n)  {

      if (n <= 1) return -1;

      if ( n== 2 || n == 1)  return 1;

      long f1 = f2 = 1;

      long f3  ;

     for ( int i = 3; i <= n; i++ )  {

         f3 = f1+f2;

         f2 = f3;

         f1 = f2;

     }

     return f3;

}

或者 (来自书上,是错的)

long fib (int n)  {

  if ( n <= 1) return -1;

  if ( n == 1 || n == 2)   return 1;

  long f1 = 1; f2 = 1, f3;

  int i;

  for ( f3 = f1 + f2, i = 2 ; i < n ; i++ )  {

      f1 = f2;

   f2  = f3;

      f3 = f1 + f2;

    }

还有一种 logN 的解法,以后再补上。

6  最大公约数问题

gcd ( m, n ) = {  n (m%n == 0);   gcd (n , m % n) ;

long gcd ( long m, long n)  {

     return m % n == 0? n ; gcd ( n, m % n);

}

7 汉诺塔 henoi 问题

void moveone (char from,char to )  {

          printf (" %c -> %c ", from,to);

}

void henoi  ( char from , char to , char by ,int n)  {

        if ( n == 1)  moveone ( from,to);

        else  {

              henoi  (from ,by,to,n-1);

              moveone (from,to);

              henoi  ( by,to,from,n-1);

       }

}

-------------------------------------------------------------------------------------------------------------------------------------------------

what a day.

原文地址:https://www.cnblogs.com/hanxinle/p/7879889.html