基础知识
1 | // 计算两点之间的欧几里德的距离 |
1 | // 4.1 组合数(有BUG,中间变量可能会溢出) |
1 | // 4.1 组合数 |
1 | // 4.2 素数判定 (有问题) |
1会被误判为素数,当n太大的时候,当n为接近int最大值的素数时候,i*i有可能会发生溢出。
1 | // 4.2 素数判定 |
避免了重复计算sqrt(n),同时+0.5避免了xxx.99999出现后取整的误差。
1 | // 4.3 用函数交换变量(错误) |
同理,试了下,java也是不行的。1
2
3
4
5
6
7
8
9
10
11public static void swap(int a, int b) {
int t = a;
a = b;
b = t;
}
public static void main(String[] args) {
int a = 3, b = 4;
swap(a, b);
System.out.printf("a = %d, b = %d.", a, b);
}
1 | // 4.3 用函数交换变量 |
Q:递归和迭代到底是什么关系?
1 | // 计算数组的元素和(错误,PS:C++中是可行的,亲测) |
新建了个c项目测试了下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int sum(int a[]) {
int ans = 0;
for (int i = 0; i < sizeof(a); i++) {
ans += a[i];
}
return ans;
}
int main() {
int a[] = {1,2,3};
printf("%d\n", sum(a));
return 0;
}
D:\Markdown\Coding\C\Exercises\main.c: In function 'sum':
D:\Markdown\Coding\C\Exercises\main.c:5:31: warning: 'sizeof' on array function parameter 'a' will return size of 'int *' [-Wsizeof-array-argument]
for (int i = 0; i < sizeof(a); i++) {
^
D:\Markdown\Coding\C\Exercises\main.c:3:13: note: declared here
int sum(int a[]) {
修改后:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int sum(int* a, int n) {
int ans = 0;
for (int i = 0; i < n; i++) {
ans += a[i];
}
return ans;
}
int main() {
int a[] = {1,2,3};
printf("%d\n", sum(a + 1, 2));
return 0;
}
5
回到c++的环境中来:c可以的c++一定可以嘛。1
2
3
4
5
6
7
8
9
10
11
12
13
14// 计算数组的元素和(正确)
int sum(int* a, int n) {
int ans = 0;
for (int i = 0; i < n; i++) {
ans += a[i];
}
return ans;
}
int a[] = {1,2,3};
printf("%d\n", sum(a + 1, 2));
return 0;
5
1 | // 计算左闭右开区间的元素和(两种写法) |
暂时掠过:函数做参数。道理明白,题先放着。
1 | // 用递归计算阶乘 |
记住,调用自己和调用其他函数没有什么本质不同。
4-1 UVa1339 Ancient Cipher
1 | int main() { |
4-2 UVa489 Hangman Judge
1 |
|
4-3 UVa133 The Dole Queue
1 |
|
4-4 UVa213 Message Decoding
1 | // UVa213 Message Decoding |
4-5 UVa512 Spreadsheet Tracking
1 |
4-6 UVa12412 A Typical Homework
1 |