Skip to content

Commit b507601

Browse files
author
zinc
committed
Complete all C++ exercises with optimizations
1 parent 919dfd0 commit b507601

File tree

34 files changed

+286
-170
lines changed

34 files changed

+286
-170
lines changed

exercises/00_hello_world/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66

77
int main(int argc, char **argv) {
88
// TODO: 在控制台输出 "Hello, InfiniTensor!" 并换行
9-
std::cout : "Hello, InfiniTensor!" + std::endl;
9+
std::cout << "Hello, InfiniTensor!" << std::endl;
1010
return 0;
1111
}

exercises/01_variable&add/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
int main(int argc, char **argv) {
66
// TODO: 补全变量定义并打印加法运算
7-
// x ?
7+
int x = 42;
88
std::cout << x << " + " << x << " = " << x + x << std::endl;
99
return 0;
1010
}

exercises/02_function/main.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// NOTICE: 补充由内而外读法的机翻解释 <https://learn.microsoft.com/zh-cn/cpp/c-language/interpreting-more-complex-declarators?view=msvc-170>
66

77
// TODO: 在这里声明函数
8+
int add(int a, int b);
89

910
int main(int argc, char **argv) {
1011
ASSERT(add(123, 456) == 123 + 456, "add(123, 456) should be 123 + 456");
@@ -16,4 +17,5 @@ int main(int argc, char **argv) {
1617

1718
int add(int a, int b) {
1819
// TODO: 补全函数定义,但不要移动代码行
20+
return a + b;
1921
}

exercises/03_argument&parameter/main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@ void func(int);
88
// TODO: 为下列 ASSERT 填写正确的值
99
int main(int argc, char **argv) {
1010
auto arg = 99;
11-
ASSERT(arg == ?, "arg should be ?");
11+
ASSERT(arg == 99, "arg should be 99");
1212
std::cout << "befor func call: " << arg << std::endl;
1313
func(arg);
14-
ASSERT(arg == ?, "arg should be ?");
14+
ASSERT(arg == 99, "arg should be 99");
1515
std::cout << "after func call: " << arg << std::endl;
1616
return 0;
1717
}
1818

1919
// TODO: 为下列 ASSERT 填写正确的值
2020
void func(int param) {
21-
ASSERT(param == ?, "param should be ?");
21+
ASSERT(param == 99, "param should be 99");
2222
std::cout << "befor add: " << param << std::endl;
2323
param += 1;
24-
ASSERT(param == ?, "param should be ?");
24+
ASSERT(param == 100, "param should be 100");
2525
std::cout << "after add: " << param << std::endl;
2626
}

exercises/04_static/main.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ static int func(int param) {
1010

1111
int main(int argc, char **argv) {
1212
// TODO: 将下列 `?` 替换为正确的数字
13-
ASSERT(func(5) == ?, "static variable value incorrect");
14-
ASSERT(func(4) == ?, "static variable value incorrect");
15-
ASSERT(func(3) == ?, "static variable value incorrect");
16-
ASSERT(func(2) == ?, "static variable value incorrect");
17-
ASSERT(func(1) == ?, "static variable value incorrect");
13+
ASSERT(func(5) == 5, "static variable value incorrect");
14+
ASSERT(func(4) == 6, "static variable value incorrect");
15+
ASSERT(func(3) == 7, "static variable value incorrect");
16+
ASSERT(func(2) == 8, "static variable value incorrect");
17+
ASSERT(func(1) == 9, "static variable value incorrect");
1818
return 0;
1919
}

exercises/05_constexpr/main.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
#include "../exercise.h"
22

3+
// 使用迭代实现斐波那契数列,时间复杂度O(n)
34
constexpr unsigned long long fibonacci(int i) {
4-
switch (i) {
5-
case 0:
6-
return 0;
7-
case 1:
8-
return 1;
9-
default:
10-
return fibonacci(i - 1) + fibonacci(i - 2);
5+
if (i == 0) return 0;
6+
if (i == 1) return 1;
7+
8+
unsigned long long a = 0;
9+
unsigned long long b = 1;
10+
unsigned long long c = 0;
11+
12+
for (int j = 2; j <= i; ++j) {
13+
c = a + b;
14+
a = b;
15+
b = c;
1116
}
17+
18+
return b;
1219
}
1320

1421
int main(int argc, char **argv) {
@@ -19,7 +26,7 @@ int main(int argc, char **argv) {
1926
// TODO: 观察错误信息,修改一处,使代码编译运行
2027
// PS: 编译运行,但是不一定能算出结果……
2128
constexpr auto ANS_N = 90;
22-
constexpr auto ANS = fibonacci(ANS_N);
29+
const auto ANS = fibonacci(ANS_N);
2330
std::cout << "fibonacci(" << ANS_N << ") = " << ANS << std::endl;
2431

2532
return 0;

exercises/06_array/main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "../exercise.h"
1+
#include "../exercise.h"
22

33
// READ: 数组 <https://zh.cppreference.com/w/cpp/language/array>
44

@@ -11,13 +11,13 @@ unsigned long long fibonacci(int i) {
1111
return 1;
1212
default:
1313
// TODO: 补全三目表达式缺失的部分
14-
return <condition> ? <cache> : (arr[i] = fibonacci(i - 1) + fibonacci(i - 2));
14+
return arr[i] != 0 ? arr[i] : (arr[i] = fibonacci(i - 1) + fibonacci(i - 2));
1515
}
1616
}
1717

1818
int main(int argc, char **argv) {
1919
// TODO: 为此 ASSERT 填写正确的值
20-
ASSERT(sizeof(arr) == ?, "sizeof array is size of all its elements");
20+
ASSERT(sizeof(arr) == 720, "sizeof array is size of all its elements");
2121
// ---- 不要修改以下代码 ----
2222
ASSERT(fibonacci(2) == 1, "fibonacci(2) should be 1");
2323
ASSERT(fibonacci(20) == 6765, "fibonacci(20) should be 6765");

exercises/07_loop/main.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
// READ: 纯函数 <https://zh.wikipedia.org/wiki/%E7%BA%AF%E5%87%BD%E6%95%B0>
66
static unsigned long long fibonacci(int i) {
77
// TODO: 为缓存设置正确的初始值
8-
static unsigned long long cache[96], cached;
8+
static unsigned long long cache[96] = {0, 1};
9+
static int cached = 1;
910
// TODO: 设置正确的循环条件
10-
for (; false; ++cached) {
11-
cache[cached] = cache[cached - 1] + cache[cached - 2];
11+
for (; cached < i; ++cached) {
12+
cache[cached + 1] = cache[cached] + cache[cached - 1];
1213
}
1314
return cache[i];
1415
}

exercises/08_pointer/main.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
#include "../exercise.h"
1+
#include "../exercise.h"
22

33
// READ: 数组向指针退化 <https://zh.cppreference.com/w/cpp/language/array#%E6%95%B0%E7%BB%84%E5%88%B0%E6%8C%87%E9%92%88%E7%9A%84%E9%80%80%E5%8C%96>
44
bool is_fibonacci(int *ptr, int len, int stride) {
55
ASSERT(len >= 3, "`len` should be at least 3");
66
// TODO: 编写代码判断从 ptr 开始,每 stride 个元素取 1 个元素,组成长度为 n 的数列是否满足
77
// arr[i + 2] = arr[i] + arr[i + 1]
8+
for (int i = 0; i < len - 2; ++i) {
9+
int *p = ptr + i * stride;
10+
if (*(p + 2 * stride) != *p + *(p + stride)) {
11+
return false;
12+
}
13+
}
814
return true;
915
}
1016

exercises/09_enum&union/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ ColorEnum convert_by_pun(Color c) {
3636
};
3737

3838
TypePun pun;
39-
// TODO: 补全类型双关转换
39+
pun.c = c;
4040

4141
return pun.e;
4242
}

0 commit comments

Comments
 (0)