这些提示来自 《 从问题到程序 - 程序设计与C语言引论》 第二版 裘宗燕 ^_^
0 循环结构一般不要用浮点数进行计数,不能保证一定会循环预想的次数;
1 框架到细节的设计程序,不论是大程序还是小程序,有效分解复杂度;
2 求 200 内的平方数的方法
void solution ( ) { for (int m = 1; m * m <= 200 ; m++) printf("%d\n",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\n", 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.