學習內容
計算概論(基於C語言,北大主幹基礎課)
從問題到程式————程式設計與C語言引論
資料結構(基於C語言,北大主幹基礎課)
C語言程式設計——課程材料、參考材料和討論
最常用標準庫函式
裘宗燕(Qiu Zongyan) 北京大學數學學院資訊科學系教授
理論計算機
習題
1) 寫出執行結果
#include <stdio.h>
int main() {
unsigned int i = -2;
int j = ~i;
printf("%d
", j);
}
2) 寫出執行結果
#include <stdio.h>
void swap(int &a, int &b) {
a ^= b ^= a ^= b;
}
int main() {
int m = 5, n = 3;
swap(m, n);
printf("m = %d, n = %d
", m, n);
}
表的順序表示 答案
/* 定義順序表的大小。應根據需要修改 */
#define MAXNUM 20
/* 定義順序表的元素型別。應根據需要修改 */
typedef int DataType;
struct SeqList {
int n; /* 存放線性表中元素的個數 n < MAXNUM */
DataType element[MAXNUM]; /* 存放線性表中的元素 */
};
typedef struct SeqList *PSeqList;
/* 建立新的順序表 */
PSeqList createNullList_seq(void);
/* 釋放順序表 */
void freeList_seq(PSeqList palist);
/* 判斷順序表是否為空 */
int isNullList_seq(PSeqList palist);
/* 在palist所指順序表中下標為p的元素之前插入元素x */
int insert_seq(PSeqList palist, int p, DataType x);
/* 在palist所指順序表中刪除下標為p的元素 */
int delete_seq(PSeqList palist, int p);
/* 求x在palist所指順序表中的下標 */
int locate_seq(PSeqList palist, DataType x);
/* 求palist所指順序表中下標為p的元素值 */
DataType retrieve_seq(PSeqList palist, int p);
表的連結表示 答案
/* 定義連結表元素型別。應根據需要定義 */
typedef int DataType;
struct Node; /* 單連結串列結點型別 */
typedef struct Node *PNode; /* 結點指標型別 */
typedef struct Node *LinkList; /* 單連結串列型別 */
struct Node { /* 單連結串列結點結構 */
DataType info;
PNode link;
};
/* 建立一個帶頭結點的空連結串列 */
LinkList createNullList_link(void);
/* 釋放一個帶頭節點的連結串列 */
void freeList_link(LinkList llist);
/* 判斷llist帶有頭結點的單連結串列是否是空連結串列 */
int isNullList_link(LinkList llist);
/* 在llist帶頭結點的單連結串列中下標為i的(第i+1個)結點前插入元素x */
int insert_link(LinkList llist, int i, DataType x);
/* 在llist帶有頭結點的單連結串列中刪除第一個值為x的結點 */
int delete_link(LinkList llist, DataType x);
/* 在llist帶有頭結點的單連結串列中找第一個值為x的結點儲存位置 */
PNode locate_link(LinkList llist, DataType x);
/* 在帶有頭結點的單連結串列llist中求下標為i的(第i+1個)結點的儲存位置 */
/* 當表中無下標為i的(第i+1個)元素時,返回值為NULL */
PNode find_link(LinkList llist, int i);
列舉
#include <stdio.h>
void chai(int a[], int i) {
a[2] = i%10; i /= 10;
a[1] = i%10; i /= 10;
a[0] = i;
}
int zhong(int w[]) {
int f[] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
for(int i=0; i<9; i++) {
if(f[w[i]]) return 0;
f[w[i]] = 1;
}
return 1;
}
int main() {
for(int i=123; i<=329; i++) {
int w[9];
chai(w, i);
chai(w+3, 2*i);
chai(w+6, 3*i);
if(zhong(w)) printf("%d %d %d
", i, 2*i, 3*i);
}
}
#include <stdio.h>
#define N 6
static int s[N][N];
void output_solution() {
if(s[0][10] == N*N || s[2][11] == N*N || s[3][12] == N*N) {
for(int y=0; y<N; y++) {
for(int x=0; x<N; x++) printf("%02d ", s[x][y]);
printf("
");
}
printf("
");
}
}
void dfs(int x, int y, int count) {
struct {
int x;
int y;
} hn[] = {
{ 1, 2}, { 2, 1}, { 2,-1}, { 1,-2},
{-1,-2}, {-2,-1}, {-2, 1}, {-1, 2}
};
if(count > N*N) {
output_solution();
return;
}
for(int i=0; i<8; i++) {
int tx = x + hn[i].x;
int ty = y + hn[i].y;
if(0<=tx && tx<N && 0<=ty && ty<N && !s[tx][ty]) {
s[tx][ty] = count;
dfs(tx, ty, count+1);
s[tx][ty] = 0;
}
}
}
int main() {
s[1][0] = 1;
dfs(1, 0, 2);
}
遞推
#include <stdio.h>
unsigned long Fibonacci(int n) {
static unsigned long F[100] = {1, 1};
static int N = 2;
while(N<n) {
F[N] = F[N-1]+F[N-2];
N++;
}
return F[n-1];
}
int main() {
printf("Fibonacci(2)=%lu
", Fibonacci(2));
printf("Fibonacci(3)=%lu
", Fibonacci(3));
printf("Fibonacci(5)=%lu
", Fibonacci(5));
printf("Fibonacci(19)=%lu
", Fibonacci(19));
printf("Fibonacci(80)=%lu
", Fibonacci(80));
printf("Fibonacci(90)=%lu
", Fibonacci(90));
printf("Fibonacci(91)=%lu
", Fibonacci(91));
printf("Fibonacci(92)=%lu
", Fibonacci(92));
printf("Fibonacci(93)=%lu
", Fibonacci(93));
printf("Fibonacci(95)=%lu
", Fibonacci(95));
printf("Fibonacci(100)=%lu
", Fibonacci(100));
}