C语言程序设计
int rand(void);
stdlib.h
do { magic = GetNum(); // 产生随机数 GuessNum(magic); // 猜数 printf("Play again? (Y/N) "); scanf("%1s", &cmd); } while (cmd == 'y' || cmd == 'Y');
int GetNum(void) { int x; printf("A magic number between 1 and %d has been chosen.\n", MAX_NUMBER); x = rand(); x = x % MAX_NUMBER + 1; return x; }
#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_NUMBER 1000 int GetNum(void); void GuessNum(int x); int main(void) { char command; int magic; do { magic = GetNum(); GuessNum(magic); printf("Play again? (Y/N) "); scanf("%1s", &command); } while (command == 'y' || command == 'Y'); return 0; }
a₀ = seed aₙ = (A * aₙ₋₁ + B) % M, n ≥ 1
seed
srand(unsigned int x);
srand(time(NULL)); // 使用系统时间作为种子
time(NULL)
time.h
graph TD A[源文件] --> B[编译] B --> C[目标文件] C --> D[链接] D --> E[可执行程序]
使用自定义函数的三个步骤:
类型名 函数名(参数列表) { // 声明部分 // 语句部分 }
void
return; // 无返回值 return 表达式; // 有返回值
return
类型名 函数名(参数类型表);
示例:
int max(int x, int y); int max(int, int);
函数名(实参列表);
putchar(c); c = getchar(); printf("%f", sqrt(x)); GuessNum(GetNum());
int x; scanf("%d", &x); // 传递变量地址
存储类型决定:
关键字:auto、extern、static、register
auto
extern
static
register
auto int a; // 等价于 int a;
extern int seed; // 引用性声明 int seed = 0; // 定义性声明
static int count = 0;
register int i;
&
void prn_int(int n) { if (n > 0) { printf("%d ", n); prn_int(n - 1); } printf("%d ", n); }
输出:4 3 2 1 0 1 2 3 4
4 3 2 1 0 1 2 3 4
long fact(int n) { if (n == 0 || n == 1) return 1; else return n * fact(n - 1); }
graph TD A[fact(4)] --> B[4 * fact(3)] B --> C[3 * fact(2)] C --> D[2 * fact(1)] D --> E[返回 1] E --> F[返回 2] F --> G[返回 6] G --> H[返回 24]
long factorial_iteration(int n) { int result = 1; while (n > 1) { result *= n; n--; } return result; }
long long fibo(long n) { if (n == 1 || n == 2) return 1; else return fibo(n - 1) + fibo(n - 2); }
long long fibo(long n) { static long long f[1000] = {0, 1, 1}; if (f[n]) return f[n]; return f[n] = fibo(n - 1) + fibo(n - 2); }
long long fibo(long n) { static long long a = 1; long long b, c; if (n == 1 || n == 2) return 1; b = fibo(n - 1); c = b + a; a = b; return c; }
long long fibo_tail_rec(int n, long long first, long long second) { if (n <= 1) return first; else return fibo_tail_rec(n - 1, second, first + second); }
int strlen(char s[]) { if (s[0] == '\0') return 0; else return 1 + strlen(s + 1); }
void move(int n, int a, int b, int c) { if (n == 1) printf("%c --> %c\n", a, c); else { move(n - 1, a, c, b); printf("%c --> %c\n", a, c); move(n - 1, b, a, c); } }
reverse(123)
321
is_palindrome("Level")
1
将正整数 M 划分为一系列正整数之和。
示例:M=6
6 5+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 ...
void split(int n, int cur) { if (n == 0) { // 输出分划方案 } else { for (int i = n; i >= 1; i--) { if (i 值可行) { a[cur] = i; split(n - i, cur + 1); } } } }
void find(int a[], int k) { if (k == 5) { // 输出解 } else { for (int i = 0; i < 10; i++) { if (i 未用过) { a[k] = i; find(a, k + 1); } } } }
在 8×8 棋盘上放置 8 个皇后,使其互不攻击。
void find(int a[], int i) { if (i == 8) { // 输出解 } else { for (int j = 0; j < 8; j++) { if (互不攻击) { a[i] = j; find(a, i + 1); } } } }