├── .gitignore ├── LICENSE ├── README.md ├── final ├── 1188.cpp ├── 1261.cpp ├── 1261b.cpp ├── 1318AC.cpp ├── 1501.cpp ├── 1833.cpp ├── FactorialLastNonzeroDigit.cpp ├── J.cpp ├── assert.c ├── classicalC.c ├── contest1170.md ├── cppDemo.cpp ├── malloc.c ├── newCpp.cpp └── unitTest.c ├── lec01 ├── Untitled1.c ├── Untitled2.c ├── hack.c ├── sizeof.c └── 指针I.pdf ├── lec02 ├── Untitled3.c ├── add2.c ├── arrPoint1.c ├── arrPoint2.c ├── arrfunc1.c ├── arrfunc2.c ├── arrfunc3.c ├── review.c ├── root2.c └── 指针II.pdf ├── lec03 ├── 1060.c ├── 1205.c ├── 1274.c ├── Untitled3.c ├── benchmark.c ├── floatArrSort.c ├── integrate1.c ├── integrate2.c ├── qsort.c ├── readme.MD ├── select.c ├── select2.c └── voidp.c ├── lec04 ├── strcat.c ├── strcpy.c ├── strlen.c ├── strreplace.c ├── strstr.c ├── swap0.c ├── swap1.c ├── swap2.c ├── swap3.c ├── swap4.c ├── swap5.c ├── swap6.c └── sysmetric.c ├── lec05 ├── 2238.c ├── 2465.c ├── 2466.c ├── 2469.c ├── 2474.c ├── 2478.c ├── 2483.c ├── 2487.c └── 2492.c ├── lec06-struct ├── demo.c ├── outline.MD ├── point.c ├── point2.c ├── point3.c ├── point4.c ├── point5.c └── typedef.c ├── lec07-struct2 ├── fraction.c └── fraction2.c ├── lec08-sorting ├── 1572.c ├── point.c ├── readme.MD ├── wechat0.c └── wechat1.c ├── lec09-highprecision ├── 1574.c ├── add.c ├── bigInt.c ├── bigIntInput.c └── factor.c ├── lec10-greedy ├── A.c ├── B.c ├── C.c ├── D.c └── readme.md ├── lec11-dynamicprogramming ├── cnrDp.cpp ├── factor1.c ├── factor2.c ├── factor3.c ├── fib.cpp ├── fib2.cpp ├── outline.MD └── sievePrimer.c ├── lec13-search ├── dfs.c ├── dfs2.c ├── perm.c ├── prob.md ├── search.md └── subSet.cpp ├── lec14 ├── bsearch.c ├── dfs.c ├── outline.MD ├── pre.c ├── step0.c ├── step1.c ├── step2.c ├── step3.c ├── step4.c ├── step5.c └── testCPUAll.c ├── lec15-datastructure ├── 1581a.c ├── 1581b.c ├── darray.c ├── dynamicArray.c ├── input.txt ├── outline.MD └── output.txt ├── lec16 ├── 1583.c ├── stack0.c ├── stackApp1.c ├── stackApp2.c └── stackApp3.c ├── lec17queue ├── 1582.c ├── decodeQQ.c └── queue.c ├── lec18 ├── 1145a.c ├── 1145b.c ├── 1221.c ├── UniList.c ├── headInsert.c └── list.md ├── lec19 ├── 1221.c ├── 1221.in ├── assert.c ├── list.c ├── outline.MD ├── root2.c ├── sortString.c └── unitTest.c ├── lec20 ├── 1584.c ├── 2030.c ├── arr2d.c ├── outline.md ├── sort2.c ├── strSort.c └── strSort2.c └── lec21 ├── gcd.c ├── intLen.c ├── mod.c ├── outline.md ├── prime.c └── rationalize.c /.gitignore: -------------------------------------------------------------------------------- 1 | # ---> C 2 | # Object files 3 | *.o 4 | *.ko 5 | *.obj 6 | *.elf 7 | 8 | # Precompiled Headers 9 | *.gch 10 | *.pch 11 | 12 | # Libraries 13 | *.lib 14 | *.a 15 | *.la 16 | *.lo 17 | 18 | # Shared objects (inc. Windows DLLs) 19 | *.dll 20 | *.so 21 | *.so.* 22 | *.dylib 23 | 24 | # Executables 25 | *.exe 26 | *.out 27 | *.app 28 | *.i*86 29 | *.x86_64 30 | *.hex 31 | 32 | # Debug files 33 | *.dSYM/ 34 | 35 | # ---> C++ 36 | # Compiled Object files 37 | *.slo 38 | *.lo 39 | *.o 40 | *.obj 41 | 42 | # Precompiled Headers 43 | *.gch 44 | *.pch 45 | 46 | # Compiled Dynamic libraries 47 | *.so 48 | *.dylib 49 | *.dll 50 | 51 | # Fortran module files 52 | *.mod 53 | 54 | # Compiled Static libraries 55 | *.lai 56 | *.la 57 | *.a 58 | *.lib 59 | 60 | # Executables 61 | *.exe 62 | *.out 63 | *.app 64 | 65 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | Copyright (c) 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CProgrammingII_17CS123 2 | 3 | CProgrammingII_17CS123 -------------------------------------------------------------------------------- /final/1188.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int isprime_poor(int n) { // O(n) 4 | if (n == 0) return 0; // fix bugs 5 | if (n == 1) return 0; // fix bugs 6 | for (int c = 2; c <= n - 1; c++) 7 | if (n % c == 0) return 0; 8 | return 1; 9 | } 10 | int isprime(int n) { // O(sqrt(n)/2) 11 | if (n == 2) return 1; 12 | if (n < 2 || n % 2 == 0) return 0; 13 | for (int c = 3; c * c <= n; c += 2) 14 | if (n % c == 0) return 0; 15 | return 1; 16 | } 17 | int main() { 18 | assert(isprime(0) == 0); // bugs 19 | assert(isprime(1) == 0); 20 | assert(isprime(2) == 1); 21 | assert(isprime(3) == 1); 22 | assert(isprime(100000007) == 1); 23 | int n; 24 | while (~scanf("%d", &n)) { 25 | int p = n / 2; 26 | if (p % 2 == 0) --p; 27 | while (p >= 3) { // O((n-3)/4) 28 | int q = n - p; 29 | if (isprime(p) && isprime(q)) { 30 | printf("%d %d\n", p, q); 31 | break; 32 | } 33 | p -= 2; 34 | } 35 | } 36 | 37 | return 0; 38 | } 39 | -------------------------------------------------------------------------------- /final/1261.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int isprime(int n) { // O(sqrt(n)/2) 3 | if (n == 2) return 1; 4 | if (n < 2 || n % 2 == 0) return 0; 5 | for (int c = 3; c * c <= n; c += 2) 6 | if (n % c == 0) return 0; 7 | return 1; 8 | } 9 | int main() { 10 | int N = 10000000; 11 | // scanf("%d",&N); 12 | int s = 0; 13 | if (N >= 3) s++; 14 | for (int p = 3; p + 2 <= N; p += 2) { 15 | if (isprime(p) && isprime(p + 2)) ++s; 16 | } 17 | printf("%d\n", s); 18 | 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /final/1261b.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #define MAXN 10000000 + 1 4 | char prime[MAXN]; 5 | void fill() { 6 | memset(prime, 1, sizeof(prime)); 7 | prime[0] = prime[1] = 0; // 0,1不是质数 8 | for (int i = 2; i * i <= MAXN; i++) { 9 | if (prime[i]) 10 | for (int j = i * i; j < MAXN; j += i) prime[j] = 0; 11 | } 12 | } 13 | int main() { 14 | fill(); 15 | int N = 10000000; 16 | scanf("%d", &N); 17 | int s = 0; 18 | if (N >= 3) s++; 19 | for (int p = 3; p + 2 <= N; p += 2) { 20 | if (prime[p] && prime[p + 2]) ++s; 21 | } 22 | printf("%d\n", s); 23 | 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /final/1318AC.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main() { 4 | freopen("input.txt", "r", stdin); 5 | int N; 6 | scanf("%d", &N); 7 | while (N--) { 8 | int n, m; 9 | scanf("%d%d", &n, &m); 10 | int s = 0; 11 | for (int i = 1; i <= n; i++) { 12 | s += i % m; 13 | } 14 | printf("%d\n", s); 15 | } 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /final/1501.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | unsigned mpow(int a, int p, int m) { 3 | a %= m; 4 | if (a == 1 || p == 0) return 1; 5 | if (a == 0 || p == 1) return a; 6 | if (p % 2 == 0) 7 | return mpow((a * a) % m, p / 2, m); 8 | else 9 | return (mpow((a * a) % m, p / 2, m) * a) % m; 10 | } 11 | int main() { 12 | unsigned int a, p, m; 13 | while (~scanf("%d%d%d", &a, &p, &m)) { 14 | if (a == 0 && p == 0 && m == 0) break; 15 | printf("%u\n", mpow(a, p, m)); 16 | } 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /final/1833.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | int a[10][4]= 3 | { 4 | {0,0,0,0},{1,1,1,1},{2,4,8,6},{3,9,7,1},{4,6,4,6},{5,5,5,5},{6,6,6,6},{7,9,3,1}, 5 | {8,4,2,6},{9,1,9,1} 6 | }; 7 | 8 | int main() 9 | { 10 | 11 | 12 | } 13 | -------------------------------------------------------------------------------- /final/FactorialLastNonzeroDigit.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | int D[10][4] = {{0, 0, 0, 0}, 4 | {1, 1, 1, 1}, 5 | {2, 4, 8, 6}, 6 | {3, 9, 7, 1}, 7 | {4, 6, 4, 6}, 8 | {5, 5, 5, 5}, 9 | {6, 6, 6, 6}, 10 | {7, 9, 3, 1}, 11 | {8, 4, 2, 6}, 12 | {9, 1, 9, 1}}; 13 | bool isPrime(int n) { 14 | if (n == 2) return true; 15 | if (n < 2 || n % 2 == 0) return false; 16 | int c; 17 | for (c = 3; c * c <= n; c += 2) 18 | if (n % c == 0) return false; 19 | return true; 20 | } 21 | int main() { 22 | map f; 23 | int n = 1000000; 24 | for (int i = 2; i <= n; i++) { 25 | if (isPrime(i)) { 26 | int t = 0; 27 | int p = i; 28 | while (p <= n) { 29 | t += n / p; 30 | p *= i; 31 | } 32 | f[i % 10] += t; 33 | } 34 | } 35 | 36 | f[2] -= f[5]; 37 | f[5] = 0; 38 | 39 | int s = 1; 40 | for (auto j : f) { 41 | if (j.second > 4) j.second %= 4; 42 | int k = D[j.first][j.second - 1]; 43 | s = (s * k) % 10; 44 | } 45 | cout << s << endl; 46 | } -------------------------------------------------------------------------------- /final/J.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | char F[61] = "011235831459437077415617853819099875279651673033695493257291"; 3 | int main() { 4 | long long k; 5 | scanf("%lld", &k); 6 | putchar(F[k % 60]); 7 | return 0; 8 | } 9 | -------------------------------------------------------------------------------- /final/assert.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() { 4 | int x; 5 | scanf("%d", &x); 6 | assert(x >= 0); 7 | double y = sqrt(x); 8 | printf("%f\n", y); 9 | return 0; 10 | } 11 | -------------------------------------------------------------------------------- /final/classicalC.c: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | struct A { 4 | int x; 5 | int y; 6 | }; 7 | int main() { 8 | struct A a; 9 | int i; 10 | for (i = 0; i < 10; i++) { 11 | printf("%d\n", i); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /final/contest1170.md: -------------------------------------------------------------------------------- 1 | # A: 循环最多2^20 百万 1s 2 | # B:素数筛 3 | 1. 筛出[1,1e6]所有的质数 nlglgN 4 | 2. 该区间的数prime(n) O(1) 5 | 3. 统计 p= [3,n-2,2] prime(p)&&prime(p+2) 6 | # C: 筛法 优化的质数函数(O(sqrt))*O(n/4) 7 | 1. P=n/2 p— 8 | 2. p-=2 9 | # D: 10 | # E: unsigned 快速幂 模运算 11 | 1. (a*b)%m=((a%m)*(b%m))%m 12 | int mpow(int a,int p,int m){ //O(logp) 13 | a=a%m; 14 | if(a==1||p==0)return 1; 15 | if(p%2==0)return mpow((a*a)%m,p/2); 16 | return (mpow(a*a,p/2)%m*a%m)%m 17 | } 18 | # F:int gcd(a,b){ return b==0?a:gcd(b,a%b);} 19 | 20 | # G: 21 | X= lg(N^N)=N*lgN 22 | Y=fmod(X,1.0) 23 | Z=(int)(pow(10,Y)) 24 | # H 25 | 1. if(n>=25)n=24 26 | 2. A[25] A[0]=1 27 | 3. A[i]=(A[i-1]*i)%1000000 28 | 4. Sum(A[1~n]) 29 | -------------------------------------------------------------------------------- /final/cppDemo.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main() { 4 | freopen("input.txt", "r", stdin); 5 | int N; 6 | scanf("%d", &N); 7 | while (N--) { 8 | int n, m; 9 | scanf("%d%d", &n, &m); 10 | int s = 0; 11 | for (int i = 1; i <= n; i++) { 12 | s += i % m; 13 | } 14 | printf("%d\n", s); 15 | } 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /final/malloc.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() { 4 | int n = 20000000000; 5 | int *p = (int *)malloc(sizeof(int) * n); 6 | assert(p != NULL); 7 | int i; 8 | for (i = 0; i < 1000; i++) p[i] = i; 9 | } 10 | -------------------------------------------------------------------------------- /final/newCpp.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | struct A { 4 | int x; 5 | int y; 6 | }; 7 | int main() { 8 | A a; 9 | 10 | for (int i = 0; i < 10; i++) { 11 | printf("%d\n", i); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /final/unitTest.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int add(int a, int b) { return a + b; } 4 | 5 | int main() { 6 | assert(add(0, 0) == 0); 7 | assert(add(1, 1) == 2); 8 | printf("%d\n", add(2, 2)); 9 | return 0; 10 | } 11 | -------------------------------------------------------------------------------- /lec01/Untitled1.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec01/Untitled1.c -------------------------------------------------------------------------------- /lec01/Untitled2.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec01/Untitled2.c -------------------------------------------------------------------------------- /lec01/hack.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | int x=4; 5 | // x++; 6 | const int y=5; 7 | // y++; 8 | printf("&x=%d\n",&x); 9 | printf("&y=%d\n",&y); 10 | int *p=&x; 11 | ++*p; 12 | printf("x=%d\n",x); 13 | --p; 14 | ++*p; 15 | printf("const y=%d\n",y); 16 | 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /lec01/sizeof.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() 3 | { 4 | printf("%d\n",sizeof(char)); 5 | printf("%d\n",sizeof(int)); 6 | printf("%d\n",sizeof(long long)); 7 | printf("%d\n",sizeof(float)); 8 | printf("%d\n",sizeof(double)); 9 | printf("%d\n",sizeof(char*)); 10 | 11 | puts("--------------------"); 12 | printf("%d\n",sizeof(int*)); 13 | printf("%d\n",sizeof(long long*)); 14 | printf("%d\n",sizeof(float*)); 15 | printf("%d\n",sizeof(double*)); 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /lec01/指针I.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec01/指针I.pdf -------------------------------------------------------------------------------- /lec02/Untitled3.c: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /lec02/add2.c: -------------------------------------------------------------------------------- 1 | #include 2 | int add(int x, int y) { return x + y; } 3 | int mul(int x, int y) { return x * y; } 4 | void add2(int x, int y, int *z) { *z = x + y; } 5 | void foo(int x, int y, int *sum, int *mul) { 6 | *sum = x + y; 7 | *mul = x * y; 8 | } 9 | int main() { 10 | int a = 3, b = 4; 11 | int c, d; 12 | foo(a, b, &c, &d); 13 | printf("c=%d d=%d\n", c, d); 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /lec02/arrPoint1.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec02/arrPoint1.c -------------------------------------------------------------------------------- /lec02/arrPoint2.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec02/arrPoint2.c -------------------------------------------------------------------------------- /lec02/arrfunc1.c: -------------------------------------------------------------------------------- 1 | void print(int *a, int n) { 2 | int *p; 3 | for (p = a; p < a + n; p++) printf("%d ", *p); 4 | printf("\n"); 5 | } 6 | void input(int *a, int n) { 7 | int *p; 8 | for (p = a; p < a + n; p++) scanf("%d", p); 9 | } 10 | int main() { 11 | int a[10]; 12 | input(a, 10); 13 | print(a, 10); 14 | 15 | return 0; 16 | } 17 | -------------------------------------------------------------------------------- /lec02/arrfunc2.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec02/arrfunc2.c -------------------------------------------------------------------------------- /lec02/arrfunc3.c: -------------------------------------------------------------------------------- 1 | #include 2 | void g(int *x) { ++*x; } 3 | 4 | int main() { 5 | int x = 3; 6 | g(&x); 7 | printf("%d\n", x); 8 | return 0; 9 | } 10 | -------------------------------------------------------------------------------- /lec02/review.c: -------------------------------------------------------------------------------- 1 | int main() 2 | { 3 | int a; 4 | int *p=&a; 5 | *p=3; 6 | printf("%d\n",a); 7 | int b=7; 8 | p=&b; 9 | 10 | 11 | return 0; 12 | } 13 | -------------------------------------------------------------------------------- /lec02/root2.c: -------------------------------------------------------------------------------- 1 | #include 2 | int foo(double a, double b, double c, double* x1, double* x2) { 3 | if (b * b < 4 * a * c) return 0; 4 | double dt = b * b - 4 * a * c; 5 | *x1 = (-b + sqrt(dt)) / (2 * a); 6 | *x2 = (-b - sqrt(dt)) / (2 * a); 7 | return 1; 8 | } 9 | int main() { 10 | double a, b, c; 11 | scanf("%lf%lf%lf", &a, &b, &c); 12 | double x1, x2; 13 | 14 | if (foo(a, b, c, &x1, &x2)) 15 | printf("%.2f %.2f\n", x1, x2); 16 | else 17 | puts("No solutions!"); 18 | } 19 | -------------------------------------------------------------------------------- /lec02/指针II.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec02/指针II.pdf -------------------------------------------------------------------------------- /lec03/1060.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #define ABS(x) ((x) < 0 ? -(x) : (x)) 4 | int cmp(const void *a, const void *b) { 5 | int *pa = (int *)a; 6 | int *pb = (int *)b; 7 | return ABS(*pb) - ABS(*pa); 8 | } 9 | int a[100]; 10 | int main() { 11 | int n, i; 12 | while (~scanf("%d", &n) && n) { 13 | for (i = 0; i < n; i++) scanf("%d", a + i); 14 | qsort(a, n, 4, cmp); 15 | printf("%d", a[0]); 16 | for (i = 1; i < n; i++) printf(" %d", a[i]); 17 | printf("\n"); 18 | } 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /lec03/1205.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int inc(const void *a, const void *b) { 4 | char *pa = (char *)a; 5 | char *pb = (char *)b; 6 | return *pa - *pb; 7 | } 8 | int main() { 9 | char s[4]; 10 | int n; 11 | for (scanf("%d", &n); n--;) { 12 | scanf("%s", s); 13 | qsort(s, 3, 1, inc); 14 | printf("%c %c %c\n", s[0], s[1], s[2]); 15 | } 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /lec03/1274.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int inc(const void *a, const void *b) { 4 | int *pa = (int *)a; 5 | int *pb = (int *)b; 6 | return *pa - *pb; 7 | } 8 | int main() { 9 | int a[3]; 10 | scanf("%d%d%d", a, a + 1, a + 2); 11 | qsort(a, 3, 4, inc); 12 | printf("%d %d %d\n", a[0], a[1], a[2]); 13 | return 0; 14 | } 15 | -------------------------------------------------------------------------------- /lec03/Untitled3.c: -------------------------------------------------------------------------------- 1 | int icmp(int *a, int *b) { return *a - *b; } 2 | int fcmp(double *a, double *b) { 3 | double cmp = *a - *b; 4 | if (cmp < 0) return -1; 5 | if (cmp > 0) return 1; 6 | return 0; 7 | } 8 | int cmp(void *a, void *b) { 9 | int *ia = (int *)a; 10 | int *ib = (int *)b; 11 | return *ia - *ib; 12 | } 13 | int main() { 14 | int a[3] = {1, 2, 3}; 15 | printf("%d\n", icmp(&a[0], &a[1])); 16 | printf("%d\n", icmp(a, a + 1)); 17 | double b[] = {1, 2}; 18 | printf("%d\n", fcmp(a, a + 1)); 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /lec03/benchmark.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | int inc(const void *a, const void *b) { 5 | int *pa = (int *)a; 6 | int *pb = (int *)b; 7 | return *pa - *pb; 8 | } 9 | void sort(int *a, int n) { 10 | int i, j, k, t; 11 | for (i = 0; i < n; i++) { 12 | k = i; 13 | for (j = i + 1; j < n; j++) 14 | if (a[j] < a[k]) k = j; 15 | if (k != i) t = a[k], a[k] = a[i], a[i] = t; 16 | } 17 | } 18 | #define N 10000000 19 | int main() { 20 | int *p = (int *)malloc(sizeof(int) * N); 21 | if (p == NULL) { 22 | puts("Allocate failed!"); 23 | } else { 24 | int i; 25 | for (i = 0; i < N; i++) p[i] = rand(); 26 | long long start = clock(); 27 | // sort(p,N); 28 | qsort(p, N, 4, inc); 29 | long long end = clock(); 30 | printf("%.3f second(s).", (end - start) / 1000.0); 31 | free(p); 32 | } 33 | return 0; 34 | } 35 | -------------------------------------------------------------------------------- /lec03/floatArrSort.c: -------------------------------------------------------------------------------- 1 | void print(float* a, int n) { 2 | int i; 3 | for (i = 0; i < n; i++) printf("%f ", a[i]); 4 | printf("\n"); 5 | } 6 | int inc(const void* a, const void* b) { 7 | float* pa = (float*)a; 8 | float* pb = (float*)b; 9 | float cmp = *pa - *pb; 10 | if (cmp < 0) return -1; 11 | if (cmp > 0) return 1; 12 | return 0; 13 | } 14 | int main() { 15 | float a[] = {0.1, 1.2, 0.9, 4.5, 4.4}; 16 | qsort(a, sizeof(a) / sizeof(a[0]), sizeof(a[0]), inc); 17 | print(a, sizeof(a) / sizeof(a[0])); 18 | } 19 | -------------------------------------------------------------------------------- /lec03/integrate1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define N 100 3 | double f(double x) { return x + sin(cos(x * x)); } 4 | double integerate(double a, double b) { 5 | double dx = (b - a) / N; 6 | double s = 0; 7 | int i; 8 | for (i = 0; i < N; i++) { 9 | double up = sin(a + dx * i); 10 | double down = sin(a + dx * (i + 1)); 11 | double h = dx; 12 | s += (up + down) * h / 2; 13 | } 14 | return s; 15 | } 16 | double integerate2(double a, double b) { 17 | double dx = (b - a) / N; 18 | double s = 0; 19 | int i; 20 | for (i = 0; i < N; i++) { 21 | double up = cos(a + dx * i); 22 | double down = cos(a + dx * (i + 1)); 23 | double h = dx; 24 | s += (up + down) * h / 2; 25 | } 26 | return s; 27 | } 28 | int main() { 29 | printf("%.3f\n", integerate(0, 1)); // sin x [0,1] 30 | printf("%.3f\n", cos(0) - cos(1)); 31 | return 0; 32 | } 33 | -------------------------------------------------------------------------------- /lec03/integrate2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #define N 100 4 | 5 | double f(double x) { return x; } 6 | double g(double x) { return x * x; } 7 | double h(double x) { return x + sin(cos(x * x)); } 8 | double integerate(double (*f)(double), double a, double b) { 9 | double dx = (b - a) / N; 10 | double s = 0; 11 | int i; 12 | for (i = 0; i < N; i++) { 13 | double up = f(a + dx * i); 14 | double down = f(a + dx * (i + 1)); 15 | double h = dx; 16 | s += (up + down) * h / 2; 17 | } 18 | return s; 19 | } 20 | 21 | int main() { 22 | printf("%.3f\n", integerate(f, 0, 1)); // sin x [0,1] 23 | printf("%.3f\n", integerate(g, 0, 1)); 24 | printf("%.3f\n", integerate(h, 0, 1)); 25 | printf("%.3f\n", integerate(sin, 0, 1)); 26 | printf("%.3f\n", integerate(cos, 0, 1)); 27 | printf("%.3f\n", integerate(exp, 0, 1)); 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /lec03/qsort.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int inc(const void *a, const void *b) { 4 | int *pa = (int *)a; 5 | int *pb = (int *)b; 6 | return *pa - *pb; 7 | } 8 | int dec(const void *a, const void *b) { 9 | int *pa = (int *)a; 10 | int *pb = (int *)b; 11 | return *pb - *pa; 12 | } 13 | int mars(const void *va, const void *vb) { 14 | int *a = (int *)va; 15 | int *b = (int *)vb; 16 | int cmp = hash(*a) - hash(*b); 17 | if (cmp) return cmp; 18 | return inc(a, b); 19 | } 20 | int hash(int n) { return n < 10 ? n : hash(n / 10) + n % 10; } 21 | void print(int *a, int n) { 22 | int i; 23 | for (i = 0; i < n; i++) printf("%d ", a[i]); 24 | printf("\n"); 25 | } 26 | int main() { 27 | int a[] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 111, 12, 21, 200001}; 28 | int n = sizeof(a) / sizeof(a[0]); 29 | print(a, n); 30 | // qsort(a,n,sizeof(a[0]),inc); 31 | // qsort(a,n,sizeof(a[0]),dec); 32 | qsort(a, n, sizeof(a[0]), mars); 33 | print(a, n); 34 | return 0; 35 | } 36 | -------------------------------------------------------------------------------- /lec03/readme.MD: -------------------------------------------------------------------------------- 1 | 指向函数的指针 2 | -------------------------------------------------------------------------------- /lec03/select.c: -------------------------------------------------------------------------------- 1 | #include 2 | int inc(int *a, int *b) { return *a - *b; } 3 | int dec(int *a, int *b) { return *b - *a; } 4 | void sort(int *a, int n, int (*cmp)(int *, int *)) { 5 | int i, j, k, t; 6 | for (i = 0; i < n; i++) { 7 | k = i; 8 | for (j = i + 1; j < n; j++) 9 | if (cmp(a + j, a + k) < 0) // if(a[j] 2 | int inc(int *a, int *b) { return *a - *b; } 3 | int dec(int *a, int *b) { return *b - *a; } 4 | int mars(int *a, int *b) { 5 | int cmp = hash(*a) - hash(*b); 6 | if (cmp) return cmp; 7 | return inc(a, b); 8 | } 9 | int hash(int n) { return n < 10 ? n : hash(n / 10) + n % 10; } 10 | void sort(int *a, int n, int (*cmp)(int *, int *)) { 11 | int i, j, k, t; 12 | for (i = 0; i < n; i++) { 13 | k = i; 14 | for (j = i + 1; j < n; j++) 15 | if (cmp(a + j, a + k) < 0) // if(a[j] 2 | int main() { 3 | int x = 3; 4 | long long y = 0xfffffffffffffff; 5 | printf("%d %lld\n", x, y); 6 | void *p; 7 | p = &x; 8 | 9 | int *q; 10 | q = (int *)p; 11 | p = &y; 12 | long long *r; 13 | r = (long long *)p; 14 | } 15 | -------------------------------------------------------------------------------- /lec04/strcat.c: -------------------------------------------------------------------------------- 1 | #include 2 | //#include 3 | void strcat(char* to, const char* from) { 4 | while (*to) ++to; 5 | while (*to++ = *from++) 6 | ; 7 | } 8 | int main() { 9 | 10 | char s[100] = "hello"; 11 | char t[100] = " world"; 12 | 13 | puts(s); 14 | strcat(s, t); // s+=t; 15 | return 0; 16 | puts(s); 17 | } -------------------------------------------------------------------------------- /lec04/strcpy.c: -------------------------------------------------------------------------------- 1 | #include 2 | //#include 3 | void strcpy(char* to, char* from) { 4 | while (*to++ = *from++) 5 | ; 6 | } 7 | int main() { 8 | 9 | char s[100] = "hello"; 10 | char t[100] = "abc"; 11 | 12 | puts(t); 13 | strcpy(t, s); 14 | puts(t); 15 | return 0; 16 | } -------------------------------------------------------------------------------- /lec04/strlen.c: -------------------------------------------------------------------------------- 1 | #include 2 | int strlen(const char *s) { 3 | const char *p = s; 4 | while (*p) p++; 5 | return p - s; 6 | } 7 | int main() { 8 | printf("%d\n", 0 == strlen("")); 9 | printf("%d\n", 1 == strlen("a")); 10 | printf("%d\n", 5 == strlen("abcba")); 11 | 12 | return 0; 13 | } 14 | -------------------------------------------------------------------------------- /lec04/strreplace.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() { 4 | 5 | char s[100] = "So we think we can do what we do."; 6 | char k1[100] = "we"; 7 | char k2[100] = "you"; 8 | char t[100]; //最终t里面存储"So you think you can." 9 | 10 | int n1 = strlen(k1), n2 = strlen(k2); 11 | char *p = s; 12 | while (p = strstr(p, k1)) { 13 | strncpy(t, s, p - s); 14 | t[p - s] = 0; 15 | strcat(t, k2); 16 | strcat(t, p + n1); 17 | strcpy(s, t); 18 | } 19 | puts(t); 20 | 21 | return 0; 22 | } -------------------------------------------------------------------------------- /lec04/strstr.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() { 4 | 5 | char s[100] = "So we think we can."; 6 | char k1[100] = "we"; 7 | 8 | char *p = strstr(s, k1); 9 | if (p != NULL) 10 | printf("%d\n", p - s); 11 | else 12 | puts("NOT FOUND!"); 13 | 14 | p += strlen(k1); 15 | p = strstr(p, k1); 16 | if (p != NULL) 17 | printf("%d\n", p - s); 18 | else 19 | puts("NOT FOUND!"); 20 | 21 | return 0; 22 | } -------------------------------------------------------------------------------- /lec04/swap0.c: -------------------------------------------------------------------------------- 1 | #include 2 | void swap(int a, int b) // wrong version 3 | { 4 | int t = a; 5 | a = b; 6 | b = t; 7 | } 8 | int main() { 9 | int a = 3, b = 4; 10 | swap(a, b); 11 | printf("%d %d\n", a, b); 12 | return 0; 13 | } 14 | -------------------------------------------------------------------------------- /lec04/swap1.c: -------------------------------------------------------------------------------- 1 | int main() { 2 | int a = 3, b = 4; 3 | printf("&a=%x &b=%x\n", &a, &b); 4 | int* p = &a, *q = &b; 5 | int* t; 6 | t = p; // t=f00 7 | p = q; // p=efc 8 | q = t; // q=f00 9 | printf("%d %d\n", *p, *q); // OK 10 | } 11 | -------------------------------------------------------------------------------- /lec04/swap2.c: -------------------------------------------------------------------------------- 1 | int main() { 2 | int a = 3, b = 4; 3 | printf("&a=%x &b=%x\n", &a, &b); 4 | int* p = &a, *q = &b; 5 | int* t; 6 | int d; 7 | t = &d; 8 | *t = *p; 9 | *p = *q; 10 | *q = *t; 11 | printf("%d %d\n", *p, *q); // OK 12 | } 13 | -------------------------------------------------------------------------------- /lec04/swap3.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() { 3 | int a = 3, b = 4; 4 | printf("&a=%x &b=%x\n", &a, &b); 5 | int *p = &a, *q = &b; 6 | 7 | int d; 8 | d = *p; 9 | *p = *q; 10 | *q = d; 11 | printf("%d %d\n", *p, *q); // OK 12 | } 13 | -------------------------------------------------------------------------------- /lec04/swap4.c: -------------------------------------------------------------------------------- 1 | #include 2 | void swap(int a, int b) { 3 | int t; 4 | t = a; 5 | a = b; 6 | b = t; 7 | } 8 | int main() { 9 | int a = 3, b = 4; 10 | swap(a, b); 11 | printf("%d %d\n", a, b); // a=3 b=4; fail to swap 12 | } -------------------------------------------------------------------------------- /lec04/swap5.c: -------------------------------------------------------------------------------- 1 | #include 2 | void swap(int *a, int *b) { // fail to swap 3 | int *t; 4 | t = a; 5 | a = b; 6 | b = t; 7 | } 8 | int main() { 9 | int a = 3, b = 4; 10 | swap(&a, &b); 11 | printf("%d %d\n", a, b); 12 | } -------------------------------------------------------------------------------- /lec04/swap6.c: -------------------------------------------------------------------------------- 1 | #include 2 | void swap(int *a, int *b) { // swap ok 3 | int t; 4 | t = *a; 5 | *a = *b; 6 | *b = t; 7 | } 8 | int main() { 9 | int a = 3, b = 4; 10 | swap(&a, &b); 11 | printf("%d %d\n", a, b); 12 | } -------------------------------------------------------------------------------- /lec04/sysmetric.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int sys(const char* s) { 5 | if (*s == 0 || *(s + 1) == 0) return 1; 6 | const char* p, *q; 7 | p = q = s; 8 | while (*(q + 1)) ++q; 9 | while (p < q) { 10 | if (*p - *q) return 0; 11 | ++p, --q; 12 | } 13 | return 1; 14 | } 15 | 16 | int main() { 17 | printf("%d\n", 1 == sys("")); 18 | printf("%d\n", 1 == sys("a")); 19 | printf("%d\n", 0 == sys("ab")); 20 | printf("%d\n", 1 == sys("aa")); 21 | printf("%d\n", 1 == sys("abcba")); 22 | return 0; 23 | } -------------------------------------------------------------------------------- /lec05/2238.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | void root2(double a, double b, double c, double *r1, double *r2) { 4 | double dt = sqrt(b * b - 4 * a * c); 5 | *r1 = (-b + dt) / (2 * a); 6 | *r2 = (-b - dt) / (2 * a); 7 | } 8 | 9 | int main() { 10 | double a, b, c; 11 | double r1, r2; 12 | scanf("%lf%lf%lf", &a, &b, &c); 13 | root2(a, b, c, &r1, &r2); 14 | printf("r1=%7.2f\n", r1); 15 | printf("r2=%7.2f\n", r2); 16 | return 0; 17 | } 18 | 19 | /************************************************************** 20 | Problem: 2238 21 | User: 9976124 22 | Language: C 23 | Result: Accepted 24 | Time:0 ms 25 | Memory:960 kb 26 | ****************************************************************/ -------------------------------------------------------------------------------- /lec05/2465.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main() { 7 | int a, b, *p, *q; 8 | p = &a, q = &b; 9 | scanf("%d%d", p, q); 10 | if (*p < *q) { 11 | int t = *p; 12 | *p = *q; 13 | *q = t; 14 | } 15 | printf("%d %d\n", a, b); 16 | return 0; 17 | } 18 | 19 | /************************************************************** 20 | Problem: 2465 21 | User: 9976124 22 | Language: C 23 | Result: Accepted 24 | Time:0 ms 25 | Memory:944 kb 26 | ****************************************************************/ -------------------------------------------------------------------------------- /lec05/2466.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | int dec(const void* a, const void* b) { return *(int*)b - *(int*)a; } 6 | int main() { 7 | int a[3]; 8 | scanf("%d%d%d", a, a + 1, a + 2); 9 | qsort(a, 3, 4, dec); 10 | printf("%d %d %d\n", a[0], a[1], a[2]); 11 | return 0; 12 | } 13 | /************************************************************** 14 | Problem: 2466 15 | User: 9976124 16 | Language: C 17 | Result: Accepted 18 | Time:0 ms 19 | Memory:944 kb 20 | ****************************************************************/ -------------------------------------------------------------------------------- /lec05/2469.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | int dec(const void* a, const void* b) { return *(int*)b - *(int*)a; } 6 | int inc(const void* a, const void* b) { return *(int*)a - *(int*)b; } 7 | int main() { 8 | int a[100]; 9 | int n, i; 10 | scanf("%d", &n); 11 | for (i = 0; i < n; i++) scanf("%d", a + i); 12 | qsort(a, n, 4, dec); 13 | for (i = 0; i < n; i++) printf("%d ", a[i]); 14 | printf("\n"); 15 | return 0; 16 | } 17 | 18 | /************************************************************** 19 | Problem: 2469 20 | User: 9976124 21 | Language: C 22 | Result: Accepted 23 | Time:0 ms 24 | Memory:944 kb 25 | ****************************************************************/ 26 | -------------------------------------------------------------------------------- /lec05/2474.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | int main() { 6 | char* a = "I love China!"; 7 | // a[0]='x';//illegal 8 | int n; 9 | scanf("%d", &n); 10 | // printf("%c\n",a[n]);///nth char 11 | printf("%s\n", a + n); /// a subtring from nth 12 | 13 | return 0; 14 | } 15 | 16 | /************************************************************** 17 | Problem: 2474 18 | User: 9976124 19 | Language: C 20 | Result: Accepted 21 | Time:0 ms 22 | Memory:944 kb 23 | ****************************************************************/ -------------------------------------------------------------------------------- /lec05/2478.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | int main() { 6 | char s[3][100]; 7 | scanf("%s%s%s", s[0], s[1], s[2]); 8 | qsort(s, 3, 100, strcmp); 9 | printf("%s\n%s\n%s\n", s[0], s[1], s[2]); 10 | return 0; 11 | } 12 | 13 | /************************************************************** 14 | Problem: 2478 15 | User: 9976124 16 | Language: C 17 | Result: Accepted 18 | Time:0 ms 19 | Memory:944 kb 20 | ****************************************************************/ -------------------------------------------------------------------------------- /lec05/2483.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | int main() { 6 | char s[100]; 7 | int n, m; 8 | scanf("%d%d%s", &n, &m, s); 9 | puts(s + m - 1); 10 | return 0; 11 | } 12 | 13 | /************************************************************** 14 | Problem: 2483 15 | User: 9976124 16 | Language: C 17 | Result: Accepted 18 | Time:0 ms 19 | Memory:944 kb 20 | ****************************************************************/ -------------------------------------------------------------------------------- /lec05/2487.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | int main() { 6 | char s[10][100]; 7 | int i; 8 | for (i = 0; i < 10; i++) gets(s[i]); 9 | qsort(s, 10, 100, strcmp); 10 | for (i = 0; i < 10; i++) puts(s[i]); 11 | return 0; 12 | } 13 | 14 | /************************************************************** 15 | Problem: 2487 16 | User: 9976124 17 | Language: C 18 | Result: Accepted 19 | Time:0 ms 20 | Memory:944 kb 21 | ****************************************************************/ -------------------------------------------------------------------------------- /lec05/2492.c: -------------------------------------------------------------------------------- 1 | #include 2 | int strcmp(char* p, char* q) { 3 | while (*p && *q && *p == *q) { 4 | ++p, ++q; 5 | } 6 | return *p - *q; 7 | } 8 | int main() { 9 | char a[100], b[100]; 10 | scanf("%s%s", a, b); 11 | printf("%d\n", strcmp(a, b)); 12 | return 0; 13 | } 14 | 15 | /************************************************************** 16 | Problem: 2492 17 | User: 9976124 18 | Language: C 19 | Result: Accepted 20 | Time:0 ms 21 | Memory:940 kb 22 | ****************************************************************/ -------------------------------------------------------------------------------- /lec06-struct/demo.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | struct Student { 5 | char name[20]; 6 | int age; 7 | int score; 8 | }; 9 | 10 | int arr = {1, 2, 3, 4, 5}; 11 | 12 | int main() { 13 | struct Student st; 14 | strcpy(st.name, "zhangsan"); 15 | st.age = 18; 16 | st.score = 80; 17 | printf("%s %d %d\n", st.name, st.age, st.score); 18 | return 0; 19 | } 20 | -------------------------------------------------------------------------------- /lec06-struct/outline.MD: -------------------------------------------------------------------------------- 1 | #lec06 复杂数据结构:结构体 2 | ## 结构体概述 3 | - 建模需要 4 | - 结构体嵌套 5 | 6 | ## 结构体声明 7 | ``` 8 | struct Student{ 9 | char name[20]; 10 | int age; 11 | int score; 12 | }; 13 | ``` 14 | ##结构体对象创建和分量访问 //取分量运算符.优先级最高 15 | ``` 16 | struct Student st;//结构体对象创建 17 | strcpy(st.name, "zhangsan"); 18 | st.age = 18; 19 | st.score = 80; 20 | printf("%s %d %d\n", st.name, st.age, st.score); 21 | ``` 22 | ##结构体指针 //取所指向的对象分量运算符- >优先级最高 23 | ``` 24 | /////(*p).x <=> p->x 25 | ``` 26 | ## typedef使用 27 | ##结构体函数 28 | ``` 29 | typedef struct { 30 | int x; 31 | int y; 32 | } POINT; 33 | 34 | void input(POINT* p) { scanf("%d%d", &p->x, &p->y); } 35 | void print(POINT* p) { printf("%d %d\n", p->x, p->y); } 36 | double distance(POINT* p, POINT* q) { 37 | double dx = p->x - q->x; 38 | double dy = p->y - q->y; 39 | return hypot(dx, dy); 40 | } 41 | double area(POINT* p, POINT* q, POINT* r) { 42 | double a = distance(p, q); 43 | double b = distance(p, r); 44 | double c = distance(q, r); 45 | double s = (a + b + c) / 2; 46 | return sqrt(s * (s - a) * (s - b) * (s - c)); 47 | } 48 | int main() { 49 | POINT p, q, r; 50 | input(&p); 51 | input(&q); 52 | input(&r); 53 | printf("%f\n", distance(&p, &q)); 54 | printf("%f\n", area(&p, &q, &r)); 55 | } 56 | ``` -------------------------------------------------------------------------------- /lec06-struct/point.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | struct Point { 4 | int x; 5 | int y; 6 | }; 7 | 8 | int main() { 9 | struct Point p; 10 | scanf("%d%d", &p.x, &p.y); // . -> 11 | printf("%d %d\n", p.x, p.y); 12 | struct Point q, r; 13 | return 0; 14 | } 15 | -------------------------------------------------------------------------------- /lec06-struct/point2.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | struct Point { 4 | int x; 5 | int y; 6 | }; 7 | void input(struct Point p) { /// wrong pass by value 8 | printf("In function input: &p=%x\n", &p); 9 | scanf("%d%d", &p.x, &p.y); 10 | } 11 | void print(struct Point p) { printf("%d %d\n", p.x, p.y); } 12 | 13 | int main() { 14 | struct Point p = {0, 4}, q = {3, 4}, r = {0, 0}; 15 | printf("In function main: &p=%x\n", &p); 16 | input(p); 17 | print(p); 18 | return 0; 19 | } 20 | -------------------------------------------------------------------------------- /lec06-struct/point3.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | struct Point { 4 | int x; 5 | int y; 6 | }; 7 | void input(struct Point* p) { scanf("%d%d", &(*p).x, &(*p).y); } 8 | void print(struct Point* p) { printf("%d %d\n", (*p).x, (*p).y); } 9 | 10 | int main() { 11 | struct Point p = {0, 4}, q = {3, 4}, r = {0, 0}; 12 | printf("sizeof(struct Point)=%d\n", sizeof(struct Point)); 13 | printf("sizeof(struct Point*)=%d\n", sizeof(struct Point*)); 14 | // printf("In function main: &p=%x\n",&p); 15 | input(&p); 16 | print(&p); 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /lec06-struct/point4.c: -------------------------------------------------------------------------------- 1 | ///(*p).x <=> p->x 2 | /// using typedef 3 | #include 4 | typedef struct { 5 | int x; 6 | int y; 7 | } POINT; 8 | 9 | void input(POINT* p) { 10 | 11 | scanf("%d%d", &p->x, &p->y); /// right neat 12 | } 13 | void print(POINT* p) { printf("%d %d\n", p->x, p->y); } 14 | 15 | int main() { 16 | POINT p = {0, 4}, q = {3, 4}, r = {0, 0}; 17 | printf("sizeof(struct Point)=%d\n", sizeof(POINT)); 18 | printf("sizeof(struct Point*)=%d\n", sizeof(POINT*)); 19 | input(&p); 20 | print(&p); 21 | return 0; 22 | } 23 | -------------------------------------------------------------------------------- /lec06-struct/point5.c: -------------------------------------------------------------------------------- 1 | ///(*p).x <=> p->x 2 | /// using typedef 3 | #include 4 | typedef struct { 5 | int x; 6 | int y; 7 | } POINT; 8 | 9 | void input(POINT* p) { scanf("%d%d", &p->x, &p->y); } 10 | void print(POINT* p) { printf("%d %d\n", p->x, p->y); } 11 | double distance(POINT* p, POINT* q) { 12 | double dx = p->x - q->x; 13 | double dy = p->y - q->y; 14 | return hypot(dx, dy); 15 | } 16 | double area(POINT* p, POINT* q, POINT* r) { 17 | double a = distance(p, q); 18 | double b = distance(p, r); 19 | double c = distance(q, r); 20 | double s = (a + b + c) / 2; 21 | return sqrt(s * (s - a) * (s - b) * (s - c)); 22 | } 23 | int main() { 24 | POINT p, q, r; 25 | 26 | input(&p); 27 | input(&q); 28 | input(&r); 29 | printf("%f\n", distance(&p, &q)); 30 | printf("%f\n", area(&p, &q, &r)); 31 | } 32 | -------------------------------------------------------------------------------- /lec06-struct/typedef.c: -------------------------------------------------------------------------------- 1 | #include 2 | typedef int AGE; 3 | typedef long long LL; 4 | typedef int* INTPTR; 5 | struct Person {}; 6 | typedef struct Person PERSON; 7 | void f(PERSON p) {} 8 | int main() { 9 | int x; 10 | x = 180; 11 | AGE y; 12 | y = 180; 13 | LL a, b; 14 | int* p, q; /// p is pointer but q is int 15 | INTPTR r, s; /// r and s are all pointer 16 | PERSON p1, p2, p3; 17 | return 0; 18 | } 19 | -------------------------------------------------------------------------------- /lec07-struct2/fraction.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define SIGN(x) ((x) > 0 ? 1 : ((x) < 0 ? -1 : 0)) 3 | #define ABS(x) ((x) >= 0 ? (x) : -(x)) 4 | int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } 5 | typedef struct { 6 | int up; 7 | int down; 8 | } FRACTION; 9 | void simplify(FRACTION *f) { 10 | if (f->up == 0) { 11 | f->up = 0; 12 | f->down = 1; 13 | } else if (SIGN(f->up) * SIGN(f->down) > 0) { 14 | f->up = ABS(f->up); 15 | f->down = ABS(f->down); 16 | } else { 17 | f->up = -ABS(f->up); 18 | f->down = ABS(f->down); 19 | } 20 | int g = gcd(ABS(f->up), f->down); 21 | f->up /= g; 22 | f->down /= g; 23 | } 24 | void input(FRACTION *f) { 25 | scanf("%d%d", &f->up, &f->down); 26 | simplify(f); 27 | } 28 | void print(FRACTION *f) { 29 | if (f->down == 1) 30 | printf("%d\n", f->up); 31 | else 32 | printf("%d/%d\n", f->up, f->down); 33 | } 34 | void testSimplify() { 35 | FRACTION a = {4, -6}, b = {-8, -6}, c = {99, 66}, d = {0, -5}; 36 | simplify(&a), simplify(&b), simplify(&c), simplify(&d); 37 | print(&a), print(&b), print(&c), print(&d); 38 | } 39 | void add() {} // TODO 40 | void testAdd() { 41 | FRACTION a = {4, -6}, b = {-8, -6}, c; 42 | add(&a, &b, &c); 43 | print(&c); 44 | } 45 | int main() { 46 | // testSimplify(); 47 | return 0; 48 | } -------------------------------------------------------------------------------- /lec07-struct2/fraction2.c: -------------------------------------------------------------------------------- 1 | /*分数改进版本吧数位扩充为longlong,可以计算范围更大,更加实用*/ 2 | 3 | #include 4 | //绝对值 5 | #define ABS(x) ((x) > 0 ? (x) : -(x)) 6 | //符号 7 | #define SIGN(x) ((x) > 0 ? 1 : ((x) < 0 ? -1 : 0)) 8 | typedef long long LL; 9 | //最大公约数 10 | LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } 11 | 12 | typedef struct { 13 | LL up; 14 | LL down; 15 | } FRACTION; 16 | void rationalize(FRACTION* f) { 17 | if (SIGN(f->up) * SIGN(f->down) == 0) 18 | f->up = 0, f->down = 1; 19 | else if (SIGN(f->up) * SIGN(f->down) == 1) 20 | f->up = ABS(f->up), f->down = ABS(f->down); 21 | else 22 | f->up = -ABS(f->up), f->down = ABS(f->down); 23 | LL g = gcd(f->up, f->down); 24 | f->up /= g, f->down /= g; 25 | } 26 | void input(FRACTION* f) { 27 | scanf("%I64d%I64d", &f->up, &f->down); 28 | rationalize(f); 29 | } 30 | void print(FRACTION* f) { printf("%I64d/%I64d\n", f->up, f->down); } 31 | void add(FRACTION* a, FRACTION* b, FRACTION* c) { 32 | LL up = a->up * b->down + a->down * b->up; 33 | LL down = a->down * b->down; 34 | c->up = up, c->down = down; 35 | rationalize(c); 36 | } 37 | void sub(FRACTION* a, FRACTION* b, FRACTION* c) { 38 | LL up = a->up * b->down - a->down * b->up; 39 | LL down = a->down * b->down; 40 | c->up = up, c->down = down; 41 | rationalize(c); 42 | } 43 | void mul(FRACTION* a, FRACTION* b, FRACTION* c) { 44 | LL up = a->up * b->up; 45 | LL down = a->down * b->down; 46 | c->up = up, c->down = down; 47 | rationalize(c); 48 | } 49 | void div(FRACTION* a, FRACTION* b, FRACTION* c) { 50 | LL up = a->up * b->down; 51 | LL down = a->down * b->up; 52 | c->up = up, c->down = down; 53 | rationalize(c); 54 | } 55 | int main() { 56 | FRACTION sum = {0, 1}; 57 | int i = 1; 58 | for (i = 1; i <= 40; i++) { 59 | FRACTION f = {1, i}; 60 | add(&sum, &f, &sum); 61 | } 62 | print(&sum); 63 | } -------------------------------------------------------------------------------- /lec08-sorting/1572.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | typedef struct{ 4 | int length; 5 | int diameter; 6 | int number; 7 | }PIPE; 8 | void input(PIPE*p){ 9 | scanf("%d%d%d",&p->length,&p->diameter,&p->number); 10 | } 11 | void print(PIPE*p){ 12 | printf("%d %d %d\n",p->length,p->diameter,p->number); 13 | } 14 | int cmp(const void*a,const void*b){ 15 | PIPE* pa=(PIPE*)a; 16 | PIPE* pb=(PIPE*)b; 17 | if(pa->length != pb->length) 18 | return pa->length - pb->length;//length increasing 19 | if(pa->diameter != pb->diameter) 20 | return pb->diameter - pa->diameter;//diameter decreasing 21 | return pa->number - pb->number; 22 | } 23 | PIPE p[1000]; 24 | int main(){ 25 | freopen("A.in","r",stdin); 26 | int n,m,i; 27 | scanf("%d",&n); 28 | while(n--){ 29 | scanf("%d",&m);///[0,m-1] 30 | for(i=0;i 2 | #include 3 | #include 4 | typedef struct { 5 | int x, y; 6 | } POINT; 7 | void input(POINT* p) { scanf("%d%d", &p->x, &p->y); } 8 | void output(POINT* p) { printf("(%d,%d)", p->x, p->y); } 9 | double distance(POINT* from, POINT* to) { 10 | // int dx = from->x - to->x; 11 | // int dy = from->y - to->y; 12 | // return sqrt(dx*dx+dy*dy); 13 | return hypot(from->x - to->x, from->y - to->y); 14 | } 15 | double area(POINT* a, POINT* b, POINT* c) { 16 | // TODO 17 | return 0; 18 | } 19 | int main() { 20 | POINT p, q; 21 | input(&p); 22 | input(&q); 23 | // output(&p); 24 | // output(&q); 25 | printf("%.2f\n", distance(&p, &q)); 26 | } 27 | -------------------------------------------------------------------------------- /lec08-sorting/readme.MD: -------------------------------------------------------------------------------- 1 | 结构体定义 2 | 结构体作为函数参数 3 | 自定义排序实现 -------------------------------------------------------------------------------- /lec08-sorting/wechat0.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec08-sorting/wechat0.c -------------------------------------------------------------------------------- /lec08-sorting/wechat1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | typedef struct { 5 | int x, y; 6 | } POINT; 7 | 8 | void input(POINT* p) { scanf("%d%d", &p->x, &p->y); } 9 | void output(POINT* p) { printf("(%d,%d)\n", p->x, p->y); } 10 | double distance(POINT* from, POINT* to) { 11 | return hypot(from->x - to->x, from->y - to->y); 12 | } 13 | POINT me = {5, 5}; 14 | int cmp(const void* a, const void* b) { 15 | POINT* pa = (POINT*)a; 16 | POINT* pb = (POINT*)b; 17 | double da = distance(&me, pa); 18 | double db = distance(&me, pb); 19 | double ds = da - db; 20 | if (ds > 0) return 1; 21 | if (ds < 0) return -1; 22 | return 0; 23 | } 24 | 25 | int main() { 26 | POINT p[10]; 27 | int i; 28 | for (i = 0; i < 10; i++) { 29 | p[i].x = rand() % 10; 30 | p[i].y = rand() % 10; 31 | } 32 | for (i = 0; i < 10; i++) output(p + i); 33 | qsort(p, 10, sizeof(p[0]), cmp); 34 | puts("=================="); 35 | for (i = 0; i < 10; i++) output(p + i); 36 | return 0; 37 | } 38 | -------------------------------------------------------------------------------- /lec09-highprecision/1574.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #define N 100+50 6 | void str2bi(char*s,int a[N]); 7 | void printBigInt(int B[N]); 8 | void add(int a[N],int b[N],int c[N]); 9 | int main(){ 10 | char s[N],t[N]; 11 | int a[N],b[N],c[N]; 12 | while(2==scanf("%s%s",s,t)){ 13 | memset(a,0,sizeof(a)); 14 | memset(b,0,sizeof(b)); 15 | memset(c,0,sizeof(c)); 16 | str2bi(s,a); 17 | str2bi(t,b); 18 | add(a,b,c); 19 | printBigInt(c); 20 | } 21 | return 0; 22 | } 23 | void str2bi(char*s,int a[N]){ 24 | memset(a,0,sizeof(N)); 25 | int n=strlen(s); 26 | int i; 27 | for(i=0;i0)i--; 36 | 37 | for(;i>=0;i--) 38 | printf("%d",B[i]); 39 | printf("\n"); 40 | } 41 | void add(int a[N],int b[N],int c[N]) 42 | { 43 | memset(c,0,sizeof(c)); 44 | int sc=0; 45 | int i; 46 | for(i=0;i 2 | #include 3 | #include 4 | #define N 100 5 | int a[N]={3,2,1};///a=123 6 | int b[N]={8,9,9};///b=998 7 | int c[N]={0}; 8 | 9 | void printBigInt(int B[N]){ 10 | int i=N-1; 11 | while(B[i]==0&&i>0)i--; 12 | 13 | for(;i>=0;i--) 14 | printf("%d",B[i]); 15 | printf("\n"); 16 | } 17 | void add(int a[N],int b[N],int c[N]) 18 | { 19 | memset(c,0,sizeof(c)); 20 | int sc=0; 21 | int i; 22 | for(i=0;i 2 | #define N 100 3 | int a[N]={3,2,1};///a=123 4 | int b[N]={8,9,9};///b=998 5 | int c[N]={0}; 6 | 7 | void printBigInt(int B[N]){ 8 | int i=N-1; 9 | while(B[i]==0&&i>0)i--; 10 | 11 | for(;i>=0;i--) 12 | printf("%d",B[i]); 13 | printf("\n"); 14 | } 15 | 16 | int main(){ 17 | printBigInt(a); 18 | printBigInt(b); 19 | // add(a,b,c); 20 | printBigInt(c); 21 | 22 | } 23 | 24 | -------------------------------------------------------------------------------- /lec09-highprecision/bigIntInput.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #define N 100 4 | void str2bi(char*s,int a[N]){ 5 | memset(a,0,sizeof(N)); 6 | int n=strlen(s); 7 | int i; 8 | for(i=0;i0)i--; 17 | 18 | for(;i>=0;i--) 19 | printf("%d",B[i]); 20 | printf("\n"); 21 | } 22 | int main() 23 | { 24 | char s[100]; 25 | scanf("%s",s); 26 | int a[N]={0}; 27 | str2bi(s,a); 28 | printBigInt(a); 29 | } 30 | -------------------------------------------------------------------------------- /lec09-highprecision/factor.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define N 1135+50 3 | void printBigInt(int B[N]){ 4 | int i=N-1; 5 | while(B[i]==0&&i>0)i--; 6 | for(;i>=0;i--) 7 | printf("%d",B[i]); 8 | printf("\n"); 9 | } 10 | void mul(int a[N],int x){ 11 | int i; 12 | for(i=0;i 2 | int B[] = {100, 50, 20, 10, 5, 2, 1}; 3 | int f(int m) { 4 | int tot = 0, i; 5 | while (m) { 6 | for (i = 0; i < 7; i++) { 7 | tot += m / B[i]; 8 | m %= B[i]; 9 | } 10 | } 11 | return tot; 12 | } 13 | int main() { 14 | int m, i; 15 | int t; 16 | while (~scanf("%d", &m)) { 17 | if (m == 0) break; 18 | int tot = 0; 19 | while (m--) { 20 | scanf("%d", &t); 21 | tot += f(t); 22 | } 23 | printf("%d\n", tot); 24 | } 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /lec10-greedy/B.c: -------------------------------------------------------------------------------- 1 | #include 2 | int B[] = {100, 50, 20, 10, 5, 2, 1}; 3 | int main() { 4 | int m, i, j; 5 | scanf("%d", &m); 6 | while (m) { 7 | for (i = 0; i < 7; i++) { 8 | for (j = 0; j < m / B[i]; j++) printf("%d\n", B[i]); 9 | m %= B[i]; 10 | } 11 | } 12 | return 0; 13 | } 14 | -------------------------------------------------------------------------------- /lec10-greedy/C.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | typedef struct { 4 | int start, end; 5 | } Item; 6 | void input(Item* item) { scanf("%d%d", &item->start, &item->end); } 7 | void print(Item* item) { printf("[%d %d]\n", item->start, item->end); } 8 | Item items[10000]; 9 | int cmp(const void* a, const void* b) { 10 | Item* ita = (Item*)a; 11 | Item* itb = (Item*)b; 12 | return ita->end - itb->end; 13 | } 14 | int main() { 15 | int n, i; 16 | while (~scanf("%d", &n)) { 17 | for (i = 0; i < n; i++) input(items + i); ///&items[i] 18 | qsort(items, n, sizeof(Item), cmp); 19 | int tot = 0, start = 0; 20 | for (i = 0; i < n; i++) { 21 | if (items[i].start >= start) { 22 | ++tot; 23 | start = items[i].end; 24 | } 25 | } 26 | printf("%d\n", tot); 27 | } 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /lec10-greedy/D.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | typedef struct { 4 | int start, end; 5 | } Item; 6 | void input(Item* item) { scanf("%d%d", &item->start, &item->end); } 7 | void print(Item* item) { printf("[%d %d]\n", item->start, item->end); } 8 | 9 | Item items[10000]; 10 | int used[10000]; 11 | int cmp(const void* a, const void* b) { 12 | Item* ita = (Item*)a; 13 | Item* itb = (Item*)b; 14 | return ita->end - itb->end; 15 | } 16 | int main() { 17 | int n; 18 | while (~scanf("%d", &n)) { 19 | int i; 20 | for (i = 0; i < n; i++) input(items + i), used[i] = 0; 21 | qsort(items, n, sizeof(Item), cmp); 22 | int tot = 0, cnt = 0; 23 | while (cnt < n) { 24 | ++tot; 25 | int start = 0; 26 | for (i = 0; i < n; i++) { 27 | if (items[i].start >= start && used[i] == 0) { 28 | ++cnt; 29 | start = items[i].end; 30 | used[i] = 1; 31 | } 32 | } 33 | } 34 | printf("%d\n", tot); 35 | } 36 | return 0; 37 | } 38 | -------------------------------------------------------------------------------- /lec10-greedy/readme.md: -------------------------------------------------------------------------------- 1 | # lec10 - 贪心算法Greedy Algorithm 2 | ## 贪心算法的基本原理 3 | ## 贪心算法的特点/正确性 4 | ## 贪心算法的应用 5 | - 找零钱 6 | - 多任务安排1: 图书馆占座I 7 | - 多任务安排2:图书馆占座II 8 | -------------------------------------------------------------------------------- /lec11-dynamicprogramming/cnrDp.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | typedef long long LL; 4 | LL Q[30][30] = {0}; 5 | LL cnr(int n, int r) { 6 | if (Q[n][r] != 0) return Q[n][r]; 7 | if (r == 0 || r == n) return Q[n][r] = 1; 8 | return Q[n][r] = cnr(n - 1, r - 1) + cnr(n - 1, r); 9 | } 10 | int main() { 11 | int m, n; 12 | while (2 == scanf("%d%d", &m, &n)) printf("%lld\n", cnr(m, n)); 13 | 14 | r -------------------------------------------------------------------------------- /lec11-dynamicprogramming/factor1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int fact(int n) { return n <= 1 ? 1 : fact(n - 1) * n; } 4 | int main() { 5 | printf("%d\n", fact(7)); 6 | printf("%d\n", fact(7)); 7 | return 0; 8 | } 9 | -------------------------------------------------------------------------------- /lec11-dynamicprogramming/factor2.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec11-dynamicprogramming/factor2.c -------------------------------------------------------------------------------- /lec11-dynamicprogramming/factor3.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int F[13] = {0}; 4 | int fact(int n) { 5 | if (F[n] != 0) { 6 | return F[n]; 7 | } 8 | if (n <= 1) return F[n] = 1; 9 | return F[n] = fact(n - 1) * n; 10 | } 11 | void showMemory() { 12 | int i; 13 | for (i = 0; i < 13; i++) printf("%d ", F[i]); 14 | printf("\n"); 15 | } 16 | int main() { 17 | showMemory(); 18 | fact(2); 19 | showMemory(); 20 | fact(2); 21 | showMemory(); 22 | fact(12); 23 | showMemory(); 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /lec11-dynamicprogramming/fib.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int fib(int n) { 4 | if (n < 2) return n; 5 | return fib(n - 1) + fib(n - 2); 6 | } 7 | int main() { 8 | for (int i = 0; i < 50; i++) { 9 | long long start = clock(); 10 | fib(i); 11 | long long end = clock(); 12 | printf("T(%d)=%.8f\n", i, (end - start) / 1000.0); 13 | } 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /lec11-dynamicprogramming/fib2.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int F[50] = {0}; 4 | int fib(int n) { 5 | if (F[n] != 0) return F[n]; 6 | if (n < 2) return F[n] = n; 7 | return F[n] = fib(n - 1) + fib(n - 2); 8 | } 9 | int main() { 10 | for (int i = 0; i < 50; i++) { 11 | long long start = clock(); 12 | fib(i); 13 | long long end = clock(); 14 | printf("T(%d)=%.8f\n", i, (end - start) / 1000.0); 15 | } 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /lec11-dynamicprogramming/outline.MD: -------------------------------------------------------------------------------- 1 | # 动态规划 Dynamic Programming 2 | 3 | ##递归/分治算法的缺点(重复子问题求解) 4 | - 重复子问题会严重降低算法效率 5 | 6 | ### 例子 7 | - fib(n) 8 | - n! 9 | - 组合数和杨辉三角 10 | - 找零钱方案数 11 | 12 | ##动态规划的基本思想 13 | - 利用存储来避免重复子问题的求解 14 | 15 | ### 打表方法(静态规划) 16 | - 自底向上计算(递推代替递归) 17 | 18 | ### 动态规划 19 | - 自顶向下递归 20 | - 自下而上计算 21 | - 利用查表来避免重复子问题的求解 22 | 23 | 24 | #质数判定 25 | - 简单函数法 O(n) //枚举[2,n-1] 26 | - O(sqrt(n))//枚举[2,sqrt(n)] 27 | - O(sqrt(n)/2)//枚举[2,sqrt(n)]中的奇数 28 | - O(1) //一次性打表 29 | - 概率算法 -------------------------------------------------------------------------------- /lec11-dynamicprogramming/sievePrimer.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define N 1000 + 10 3 | int primer[N]; 4 | void fill() { 5 | int i, j; 6 | for (i = 0; i < N; i++) primer[i] = 1; 7 | primer[0] = primer[1] = 0; 8 | for (i = 2; i * i <= N; i++) { 9 | if (primer[i]) 10 | for (j = i * i; j < N; j += i) { 11 | primer[j] = 0; 12 | } 13 | } 14 | } 15 | int main() { 16 | fill(); 17 | int i; 18 | for (i = 0; i < 100; i++) 19 | if (primer[i]) printf("%d ", i); 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /lec13-search/dfs.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define N 4 3 | int a[N]; 4 | int used[N] = {0}; 5 | void fill() { 6 | int i; 7 | for (i = 0; i < 4; i++) a[i] = i + 1; 8 | } 9 | void dfs(int k) { 10 | if (k == N) { 11 | int i; 12 | for (i = 0; i < k; i++) 13 | if (used[i]) printf("%d ", a[i]); 14 | printf("\n"); 15 | return; 16 | } 17 | used[k] = 1; 18 | dfs(k + 1); 19 | used[k] = 0; 20 | dfs(k + 1); 21 | } 22 | int main() { 23 | fill(); 24 | dfs(0); 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /lec13-search/dfs2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define N 4 3 | int a[N]; 4 | int used[N] = {0}; 5 | 6 | void dfs(int k) { 7 | if (k == N) { 8 | int i; 9 | for (i = 0; i < k; i++) 10 | if (used[i]) printf("%d ", a[i]); 11 | printf("\n"); 12 | return; 13 | } 14 | int i; 15 | for (i = 0; i < N; i++) 16 | if (used[i] == 0) { 17 | used[i] = 1; 18 | a[i] = k; 19 | dfs(k + 1); 20 | used[i] = 0; 21 | } 22 | } 23 | int main() { 24 | dfs(0); 25 | return 0; 26 | } 27 | -------------------------------------------------------------------------------- /lec13-search/perm.c: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | int main() { 4 | int a, b, c, d; 5 | for (int a = 1; a <= 4; a++) 6 | for (int b = 1; b <= 4; b++) 7 | for (int c = 1; c <= 4; c++) 8 | for (int d = 1; d <= 4; d++) { 9 | if (a != b && a != c && a != d && b != c && b != d && c != d) 10 | printf("%d %d %d %d\n", a, b, c, d) 11 | } 12 | 13 | return 0; 14 | } -------------------------------------------------------------------------------- /lec13-search/prob.md: -------------------------------------------------------------------------------- 1 | ## 1. 选人。一个小组共五人,分别为A、B、C、D、E。现有一项任务,要他们中的3个人去完成。已知:(1)A、C不能都去;(2)B、C不能都不去;(3)如果C去了,D、E就只能去一个,且必须去一个;(4)B、C、D不能都去;(5)如果B去了,D、E就不能都去。编程找出此项任务该由哪三人去完成的所有组合。 2 | ## 2 1~9分成1:2:3的三个3位数 3 | 将1到9 这九个数字分成三个3位数,分求第一个3位数,正好是第二个3位数的二倍,是第三个3位数的三倍。问应当怎样分法。 4 | ## 3 1~9组成三个3位的平方数 5 | ## 将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,即每组三个数不允许有重复数字,也不许同其它组的三个数字重复,要求每组中的三位数都组成一个平方数。 6 | ## 4 九位累进可除数 7 | ## 求九位累进可除数。所谓九位累进可除数就是这样一个数:这个数用到1到9这九个数字组成,每个数字刚好只出现一次。这九个位数的前两位能被2整除,前三位能被3整除......前N位能被N整除,整个九位数能被9整除。 8 | -------------------------------------------------------------------------------- /lec13-search/search.md: -------------------------------------------------------------------------------- 1 | # lec11: 搜索 2 | 3 | ## 万能的解法之搜索 4 | 5 | - 解空间 6 | - 几何空间 7 | - 子集空间 8 | - 全排列空间 9 | - 深度优先搜索DFS 10 | - 广度优先搜索BFS 11 | 12 | ## 深度优先搜素dfs 13 | 14 | ## 利用dfs遍历子集空间 15 | 16 | ## 利用dfs遍历全排列空间 17 | 18 | # dfs应用 19 | -------------------------------------------------------------------------------- /lec13-search/subSet.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #define N 10 3 | 4 | int F[N + 1] = {1, 1}; 5 | void fill() { 6 | int i; 7 | for (i = 2; i <= N; i++) F[i] = F[i - 1] * i; 8 | } 9 | int main() { 10 | fill(); 11 | int target = 127; 12 | int a, b, c, d, e, f, g, h, i; 13 | for (a = 0; a <= 1; a++) 14 | for (b = 0; b <= 1; b++) 15 | for (c = 0; c <= 1; c++) 16 | for (d = 0; d <= 1; d++) 17 | for (e = 0; e <= 1; e++) 18 | for (f = 0; f <= 1; f++) 19 | for (g = 0; g <= 1; g++) 20 | for (h = 0; h <= 1; h++) 21 | for (i = 0; i <= 1; i++) { 22 | if (a * F[1] + b * F[2] + c * F[3] + d * F[4] + e * F[5] + 23 | f * F[6] + g * F[7] + h * F[8] + i * F[9] == 24 | target) { 25 | printf("%d %d %d %d %d %d %d %d %d\n", a, b, c, d, e, f, 26 | g, h, i); 27 | return 0; 28 | } 29 | } 30 | 31 | return 0; 32 | } 33 | -------------------------------------------------------------------------------- /lec14/bsearch.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include ///rand() qsort() bsearch() 3 | int cmp(const void *a, const void *b) { 4 | int *ia = (int *)a; 5 | int *ib = (int *)b; 6 | return *ia - *ib; 7 | } 8 | 9 | int main() { 10 | int a[] = {1, 2, 4, 6, 7, 7, 7, 7, 7, 7, 7, 8, 9, 100, 132}; 11 | int n = sizeof(a) / sizeof(a[0]); 12 | int key = 7; 13 | // qsort(a,n,sizeof(a[0]),cmp); 14 | int *p = bsearch(&key, a, n, sizeof(a[0]), cmp); 15 | if (p == NULL) { 16 | puts("NOT FOUND!"); 17 | } else { 18 | printf("%d at pos %d\n", key, p - a); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lec14/dfs.c: -------------------------------------------------------------------------------- 1 | #include 2 | typedef long long LL; 3 | #define N 100 4 | LL H[N + 1]; 5 | void fill() { 6 | int i; 7 | for (i = 1; i <= N; i++) H[i] = 1LL * i * i * i * i * i; 8 | } 9 | int cmp(const void* a, const void* b) { 10 | LL* la = (LL*)a; 11 | LL* lb = (LL*)b; 12 | LL dif = *la - *lb; 13 | if (dif > 0) return 1; 14 | if (dif < 0) return -1; 15 | return 0; 16 | } 17 | int a[6]; 18 | void dfs(int k, int t) { 19 | if (k == 5) { 20 | int i; 21 | LL sum = 0; 22 | for (i = 0; i < 5; i++) sum += H[a[i]]; 23 | LL* p = bsearch(&sum, H, N, sizeof(LL), cmp); 24 | if (p) { 25 | a[5] = p - H; 26 | int i; 27 | for (i = 0; i < 6; i++) printf("%d ", a[i]); 28 | printf("\n"); 29 | } 30 | return; 31 | } 32 | int i; 33 | for (i = t; i <= N; i++) { 34 | a[k] = i; 35 | dfs(k + 1, i); 36 | } 37 | } 38 | int main() { 39 | long long start=clock(); 40 | fill(); 41 | dfs(0, 1); 42 | long long end=clock(); 43 | printf("%.3f\n",(end-start)/1000.0); 44 | } 45 | -------------------------------------------------------------------------------- /lec14/outline.MD: -------------------------------------------------------------------------------- 1 | 算法优化 2 | -------------------------------------------------------------------------------- /lec14/pre.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() { 3 | printf("%d\n", 3 ^ 3); 4 | printf("%lld\n", 100 * 100 * 100 * 100 * 100); 5 | printf("%lld\n", 100 * 100 * 100 * 100 * 100 * 1LL); 6 | printf("%lld\n", 1LL * 100 * 100 * 100 * 100 * 100); 7 | } 8 | -------------------------------------------------------------------------------- /lec14/step0.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define N 100 3 | long long h(int x) { return 1LL * x * x * x * x * x; } 4 | int main() { 5 | int a, b, c, d, e, f; 6 | for (a = 1; a <= N; a++) 7 | for (b = 1; b <= N; b++) 8 | for (c = 1; c <= N; c++) 9 | for (d = 1; d <= N; d++) 10 | for (e = 1; e <= N; e++) 11 | for (f = 1; f <= N; f++) { 12 | if (h(a) + h(b) + h(c) + h(d) + h(e) == h(f)) 13 | printf("%d %d %d %d %d %d\n", a, b, c, d, e, f); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lec14/step1.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define N 100 3 | long long h(int x) { return 1LL * x * x * x * x * x; } 4 | /// assume 1<=a<=b<=c<=d<=e 2 | #define N 100 3 | /// assume 1<=a<=b<=c<=d<=e 2 | #define N 100 3 | /// assume 1<=a<=b<=c<=d<=eO(n^5*logn) 6 | long long H[N + 1]; 7 | void fill() { 8 | int i; 9 | for (i = 1; i <= N; i++) H[i] = 1LL * i * i * i * i * i; 10 | } 11 | int cmp(const void *a, const void *b) { 12 | long long *p = (long long *)a; 13 | long long *q = (long long *)b; 14 | long long dif = *p - *q; 15 | if (dif > 0) return 1; 16 | if (dif < 0) return -1; 17 | return 0; 18 | } 19 | int main() { 20 | long long start = clock(); 21 | fill(); 22 | int a, b, c, d, e, f; 23 | for (a = 1; a <= N; a++) 24 | for (b = a; b <= N; b++) 25 | for (c = b; c <= N; c++) 26 | for (d = c; d <= N; d++) 27 | for (e = d; e <= N; e++) { 28 | long long key = H[a] + H[b] + H[c] + H[d] + H[e]; 29 | long long *p = bsearch(&key, H, N + 1, sizeof(H[0]), cmp); 30 | if (p != NULL) 31 | printf("%d %d %d %d %d %d\n", a, b, c, d, e, f = p - H); 32 | } 33 | long long end = clock(); 34 | printf("%.3f\n", (end - start) / 1000.0); 35 | return 0; 36 | } 37 | -------------------------------------------------------------------------------- /lec14/step4.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define N 100 3 | /// assume 1<=a<=b<=c<=d<=eO(n^5*logn) 6 | long long H[N + 1]; 7 | void fill() { 8 | int i; 9 | for (i = 1; i <= N; i++) H[i] = 1LL * i * i * i * i * i; 10 | } 11 | int cmp(const void *a, const void *b) { 12 | long long *p = (long long *)a; 13 | long long *q = (long long *)b; 14 | long long dif = *p - *q; 15 | if (dif > 0) return 1; 16 | if (dif < 0) return -1; 17 | return 0; 18 | } 19 | int main() { 20 | long long start = clock(); 21 | fill(); 22 | int a, b, c, d, e, f; 23 | for (a = 1; a < N; a++) 24 | for (b = a; b < N; b++) 25 | for (c = b; c < N; c++) 26 | for (d = c; d < N; d++) 27 | for (e = d; e < N; e++) { 28 | long long key = H[a] + H[b] + H[c] + H[d] + H[e]; 29 | long long *p = bsearch(&key, H + (e + 1), N - e, sizeof(H[0]), cmp); 30 | if (p != NULL) 31 | printf("%d %d %d %d %d %d\n", a, b, c, d, e, f = p - H); 32 | } 33 | long long end = clock(); 34 | printf("%.3f\n", (end - start) / 1000.0); 35 | return 0; 36 | } 37 | -------------------------------------------------------------------------------- /lec14/step5.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define N 100 3 | /// assume 1<=a<=b<=c<=d<=eO(n^5*logn) 6 | /// using better Binary Search 7 | long long H[N + 1]; 8 | void fill() { 9 | int i; 10 | for (i = 1; i <= N; i++) H[i] = 1LL * i * i * i * i * i; 11 | } 12 | int cmp(const void *a, const void *b) { 13 | long long *p = (long long *)a; 14 | long long *q = (long long *)b; 15 | long long dif = *p - *q; 16 | if (dif > 0) return 1; 17 | if (dif < 0) return -1; 18 | return 0; 19 | } 20 | int main() { 21 | long long start = clock(); 22 | fill(); 23 | int a, b, c, d, e, f; 24 | for (e = 1; e < N; e++) 25 | for (d = 1; d < e; d++) 26 | for (c = 1; c < d; c++) 27 | for (b = 1; b < c; b++) 28 | for (a = 1; a < b; a++) { 29 | long long key = H[a] + H[b] + H[c] + H[d] + H[e]; 30 | long long *p = bsearch(&key, H + (e + 1), N - e, sizeof(H[0]), cmp); 31 | if (p != NULL) 32 | printf("%d %d %d %d %d %d\n", a, b, c, d, e, f = p - H); 33 | } 34 | long long end = clock(); 35 | printf("%.3f\n", (end - start) / 1000.0); 36 | return 0; 37 | } 38 | -------------------------------------------------------------------------------- /lec14/testCPUAll.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | typedef long long LL; 6 | #define N 100 7 | #define HH(x) (1LL * (x) * (x) * (x) * (x) * (x)) 8 | #define FOR(i, s, e) for ((i) = (s); (i) <= (e); ++(i)) 9 | 10 | LL hh(int x) { return 1LL * x * x * x * x * x; } 11 | LL H[1 + N] = {0LL}; 12 | 13 | int inc(const void *a, const void *b) { 14 | LL cmp = *(LL *)a - *(LL *)b; 15 | if (cmp > 0) return 1; 16 | if (cmp < 0) return -1; 17 | return 0; 18 | } 19 | 20 | void fill() { 21 | int i; 22 | for (i = 1; i <= N; i++) H[i] = 1LL * i * i * i * i * i; 23 | } 24 | 25 | int a, b, c, d, e, f; 26 | void step0() {/**brute but fail!*/ 27 | FOR(a, 1, N) FOR(b, 1, N) FOR(c, 1, N) FOR(d, 1, N) FOR(e, 1, N) 28 | FOR(f, 1, N) if (HH(f) == HH(a) + HH(b) + HH(c) + HH(d) + HH(e)) 29 | printf("%d^5+%d^5+%d^5+%d^5+%d^5=%d^5\n", a, b, c, d, e, f); 30 | } 31 | 32 | void step1() {/**ok using a<=b<=c<=d<=e 2 | int main() { 3 | freopen("input.txt", "r", stdin); 4 | freopen("output.txt", "w", stdout); 5 | int b[1001]; 6 | memset(b, 0, sizeof(b)); 7 | int n, t, i; 8 | scanf("%d", &n); 9 | while (n--) { 10 | scanf("%d", &t); 11 | b[t]++; 12 | } 13 | int tot = 0; 14 | for (i = 0; i <= 1000; i++) 15 | if (b[i] != 0) { 16 | ++tot; 17 | } 18 | printf("%d\n", tot); 19 | int first = 1; 20 | 21 | for (i = 0; i <= 1000; i++) 22 | if (b[i] != 0) { 23 | if (first == 1) { 24 | printf("%d", i); 25 | first = 0; 26 | } else 27 | printf(" %d", i); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lec15-datastructure/1581b.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int inc(const void* a, const void* b) { return *(int*)a - *(int*)b; } 4 | int main() { 5 | freopen("input.txt", "r", stdin); 6 | // freopen("output.txt","w",stdout); 7 | int a[1000]; 8 | int n, i; 9 | scanf("%d", &n); 10 | for (i = 0; i < n; i++) scanf("%d", &a[i]); 11 | qsort(a, n, sizeof(int), inc); 12 | // for(i=0;i 2 | int MAX_SIZE = 10; 3 | typedef struct { 4 | int size; 5 | int *data; 6 | } Bag; 7 | void init(Bag *b) { 8 | b->size = 0; 9 | b->data = (int *)malloc(sizeof(int) * MAX_SIZE); 10 | } 11 | void add(Bag *b, int e) { 12 | if (b->size == MAX_SIZE) { //容量加倍技术 13 | int *q = (int *)malloc(sizeof(int) * MAX_SIZE * 2); 14 | int i; 15 | for (i = 0; i < b->size; i++) q[i] = b->data[i]; 16 | free(b->data); // 17 | b->data = q; 18 | MAX_SIZE *= 2; 19 | } 20 | b->data[b->size] = e; 21 | ++b->size; 22 | } 23 | void print(Bag *b) { 24 | int i; 25 | for (i = 0; i < b->size; i++) printf("%d ", b->data[i]); 26 | printf("\n"); 27 | } 28 | int main() { 29 | Bag bag; 30 | init(&bag); 31 | int i; 32 | for (i = 0; i < 100; i++) { 33 | add(&bag, i); 34 | print(&bag); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lec15-datastructure/dynamicArray.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec15-datastructure/dynamicArray.c -------------------------------------------------------------------------------- /lec15-datastructure/input.txt: -------------------------------------------------------------------------------- 1 | 2 | 10 3 | 20 40 32 67 40 20 89 300 400 15 4 | -------------------------------------------------------------------------------- /lec15-datastructure/outline.MD: -------------------------------------------------------------------------------- 1 | test 2 | -------------------------------------------------------------------------------- /lec15-datastructure/output.txt: -------------------------------------------------------------------------------- 1 | 8 2 | 15 20 32 40 67 89 300 400 -------------------------------------------------------------------------------- /lec16/1583.c: -------------------------------------------------------------------------------- 1 | char data[1000]; 2 | int top = -1; 3 | /** 4 | top=-1 clear Stack 5 | top==-1 isEmptyStack 6 | data[top] stack top/peek 7 | data[++top]=x push x into stack 8 | x=data[top--] pop stack 9 | */ 10 | int check(char* exp) { 11 | top = -1; 12 | int i, n = strlen(exp); 13 | for (i = 0; i < n; i++) { 14 | char c = exp[i]; 15 | if ('(' == c || '[' == c || '{' == c) { 16 | data[++top] = c; 17 | } else if (')' == c) { 18 | if (top > -1 && data[top] == '(') { 19 | --top; 20 | } else 21 | return 0; 22 | } else if (']' == c) { 23 | if (top > -1 && data[top] == '[') { 24 | --top; 25 | } else 26 | return 0; 27 | } else if ('}' == c) { 28 | if (top > -1 && data[top] == '{') { 29 | --top; 30 | } else 31 | return 0; 32 | } 33 | } 34 | return top == -1; 35 | } 36 | int main() { 37 | char exp[1000]; 38 | while (~scanf("%s", exp)) puts(check(exp) ? "YES" : "NO"); 39 | return 0; 40 | } 41 | -------------------------------------------------------------------------------- /lec16/stack0.c: -------------------------------------------------------------------------------- 1 | int data[1000]; 2 | int top = -1; 3 | 4 | void showAll() { 5 | int i; 6 | for (i = 0; i <= top; i++) printf("%d ", data[i]); 7 | printf("\n"); 8 | } 9 | int main() { 10 | 11 | int x = 3; 12 | data[++top] = x; // push 13 | for (x = 4; x <= 10; x++) { 14 | data[++top] = x; 15 | showAll(); 16 | } 17 | top--; // pop 18 | showAll(); 19 | data[++top] = 11; 20 | data[top]; // top 21 | } 22 | -------------------------------------------------------------------------------- /lec16/stackApp1.c: -------------------------------------------------------------------------------- 1 | int data[1000]; 2 | int top = -1; 3 | /** 4 | top=-1 clear Stack 5 | top==-1 isEmptyStack 6 | data[top] stack top/peek 7 | data[++top]=x push x into stack 8 | top-- pop stack 9 | */ 10 | 11 | int main() { 12 | int i; 13 | for (i = 1; i <= 5; i++) data[++top] = i; 14 | while (top != -1) { 15 | printf("%d ", data[top]); 16 | --top; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lec16/stackApp2.c: -------------------------------------------------------------------------------- 1 | int data[1000]; 2 | int top = -1; 3 | /** 4 | top=-1 clear Stack 5 | top==-1 isEmptyStack 6 | data[top] stack top/peek 7 | data[++top]=x push x into stack 8 | x=data[top--] pop stack 9 | */ 10 | 11 | int main() { 12 | int n = 10230; 13 | int r = 8; 14 | top = -1; 15 | while (n > 0) { 16 | int d = n % r; 17 | data[++top] = d; 18 | n /= r; 19 | } 20 | while (top > -1) { 21 | printf("%d", data[top--]); 22 | } 23 | return 0; 24 | } 25 | -------------------------------------------------------------------------------- /lec16/stackApp3.c: -------------------------------------------------------------------------------- 1 | char data[1000]; 2 | int top = -1; 3 | /** 4 | top=-1 clear Stack 5 | top==-1 isEmptyStack 6 | data[top] stack top/peek 7 | data[++top]=x push x into stack 8 | x=data[top--] pop stack 9 | */ 10 | int check(char* exp) { 11 | top = -1; 12 | int i, n = strlen(exp); 13 | for (i = 0; i < n; i++) { 14 | char c = exp[i]; 15 | if ('(' == c) { 16 | data[++top] = c; 17 | } else if (')' == c) { 18 | if (top > -1 && data[top] == '(') { 19 | --top; 20 | } else 21 | return 0; 22 | } 23 | } 24 | return top == -1; 25 | } 26 | int main() { 27 | puts(check("(())") ? "YES" : "NO"); 28 | puts(check("()") ? "YES" : "NO"); 29 | puts(check(")(") ? "YES" : "NO"); 30 | puts(check("()()") ? "YES" : "NO"); 31 | return 0; 32 | } 33 | -------------------------------------------------------------------------------- /lec17queue/1582.c: -------------------------------------------------------------------------------- 1 | #include 2 | ///FIFO: First In First Out 3 | int data[200000]; 4 | int head=0; 5 | int tail=0; 6 | ///Queue data[head...tail-1] 7 | ///(1)Initialize head=tail=0; 8 | ///(2) isEmpty head==tail 9 | ///(3) QueryHead data[head] 10 | ///(4) QueryTail data[tail-1] 11 | ///(5) x Enqueue: data[tail++]=x 12 | ///(6) Dequeue x=data[head++] 13 | void showAll() 14 | { 15 | int i; 16 | for(i=head; i<=tail-1; i++) 17 | printf("%d ",data[i]); 18 | printf("\n"); 19 | } 20 | int Q[100000]; 21 | int main() 22 | { 23 | int n; 24 | scanf("%d",&n); 25 | int i; 26 | for(i=0; i 2 | int data[100000]; 3 | int head = 0; 4 | int tail = 0; 5 | /*** 6 | 队列操作:用[head,tail)区间表示队列 7 | 初始化队列 head=0;tail=0 8 | 判断队列是否为空 head==tail 9 | 队伍最前的元素 data[head] 10 | 队列末尾元素 data[tail-1]//!!! 11 | 出队 x=data[++head] 12 | 元素x入队 data[tail++]=x; 13 | */ 14 | void showAll() { 15 | int i; 16 | for (i = head; i <= tail - 1; i++) printf("%d ", data[i]); 17 | printf("\n"); 18 | } 19 | int main() { 20 | int Q[] = {6, 3, 1, 7, 5, 8, 9, 2, 4, }; 21 | int n = sizeof(Q) / sizeof(Q[0]); 22 | int i; 23 | for (i = 0; i < n; i++) data[tail++] = Q[i]; 24 | showAll(); 25 | while (head < tail) { 26 | printf("%d ", data[head++]); 27 | if (head == tail) { 28 | break; 29 | } 30 | data[tail++] = data[head++]; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lec17queue/queue.c: -------------------------------------------------------------------------------- 1 | #include 2 | int data[100000]; 3 | int head = 0; 4 | int tail = 0; 5 | /*** 6 | 队列操作:用[head,tail]区间表示队列 7 | 初始化队列 head=0;tail=0 8 | 判断队列是否为空 head==tail 9 | 队伍最前的元素 data[head] 10 | 队列末尾元素 data[tail-1]//!!! 11 | 出队 x=data[++head] 12 | 元素x入队 data[tail++]=x; 13 | */ 14 | void showAll() { 15 | int i; 16 | for (i = head; i <= tail - 1; i++) printf("%d ", data[i]); 17 | printf("\n"); 18 | } 19 | int main() { 20 | head = tail = 0; //初始化队列 head=tail=0 用[head,tail)区间表示队列 21 | int i; 22 | for (i = 1; i <= 10; i++) { 23 | data[tail++] = i; 24 | showAll(); 25 | } 26 | while(head 2 | #include 3 | #include 4 | void print(int* a, int n) { 5 | int i; 6 | for (i = 0; i < 26; i++) printf("%d ", a[i]); 7 | printf("\n"); 8 | } 9 | int main() { 10 | // printf("%d\n",5>4>3); 11 | // printf("%d\n",0<1<2); 12 | int freq[26]; 13 | memset(freq, 0, sizeof(freq)); 14 | // print(freq,26); 15 | freopen("1145.in", "r", stdin); 16 | char a[1000]; 17 | while (gets(a)) { 18 | int len = strlen(a); 19 | int i; 20 | for (i = 0; i < len; i++) { 21 | if (a[i] == '#') break; 22 | if ('a' <= a[i] && a[i] <= 'z') 23 | freq[a[i] - 'a']++; /// hash 24 | else if ('A' <= a[i] && a[i] <= 'Z') 25 | freq[a[i] - 'A']++; 26 | } 27 | if (a[i] == '#') break; 28 | } 29 | // print(freq,26);//debug 30 | int i; 31 | for (i = 'a'; i <= 'z'; i++) printf("%c %d\n", i, freq[i - 'a']); 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /lec18/1145b.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | void print(int* a, int n) { 5 | int i; 6 | for (i = 0; i < 26; i++) printf("%d ", a[i]); 7 | printf("\n"); 8 | } 9 | int main() { 10 | 11 | int freq[26]; 12 | memset(freq, 0, sizeof(freq)); 13 | 14 | freopen("1145.in", "r", stdin); 15 | int c; 16 | 17 | while ((c = getchar()) != EOF) { 18 | if (c == '#') break; 19 | if (isalpha(c)) freq[tolower(c) - 'a']++; 20 | } 21 | int i; 22 | for (i = 'a'; i <= 'z'; i++) printf("%c %d\n", i, freq[i - 'a']); 23 | return 0; 24 | } 25 | -------------------------------------------------------------------------------- /lec18/1221.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | typedef struct node { 4 | char str[100]; 5 | int freq; 6 | struct node* next; 7 | } NODE; 8 | NODE* head; 9 | 10 | int main() { 11 | char word[100]; 12 | while (~scanf("%s", word)) { 13 | int find = 0; 14 | NODE* p = head; 15 | while (p != NULL) { 16 | if (strcmp(p->str, word) == 0) { 17 | ++p->freq; 18 | find = 1; 19 | break; 20 | } 21 | p = p->next; 22 | } 23 | if (find == 0) { 24 | NODE* p = (NODE*)malloc(sizeof(NODE)); 25 | strcpy(p->str, word); 26 | p->freq = 1; 27 | p->next = head; 28 | head = p; 29 | } 30 | } 31 | NODE* p = head; 32 | while (p) { 33 | printf("%s:%d\n", p->str, p->freq); 34 | p = p->next; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lec18/UniList.c: -------------------------------------------------------------------------------- 1 | #define NULL 0 2 | typedef struct node { 3 | int data; 4 | struct node* next; 5 | } NODE; 6 | NODE* head; 7 | 8 | int main() { 9 | NODE* p = (NODE*)malloc(sizeof(NODE)); 10 | p->data = 0; 11 | p->next = NULL; 12 | head = p; 13 | 14 | NODE* q = (NODE*)malloc(sizeof(NODE)); 15 | q->data = 1; 16 | q->next = NULL; 17 | 18 | NODE* r = (NODE*)malloc(sizeof(NODE)); 19 | r->data = 2; 20 | r->next = NULL; 21 | 22 | p->next = q; 23 | q->next = r; 24 | 25 | NODE* cur = p; 26 | 27 | while (cur != NULL) { 28 | printf("%d->", cur->data); 29 | cur = cur->next; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lec18/headInsert.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec18/headInsert.c -------------------------------------------------------------------------------- /lec18/list.md: -------------------------------------------------------------------------------- 1 | list 2 | -------------------------------------------------------------------------------- /lec19/1221.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | typedef struct node{ 6 | char str[100]; 7 | int freq; 8 | struct node* next; 9 | }NODE; 10 | NODE* head; 11 | 12 | int main(){ 13 | //freopen("1221.in","r",stdin); 14 | //freopen("1221.out","w",stdout); 15 | char s[1000][100]; 16 | int j=0; 17 | char t[100]; 18 | while(scanf("%s",t)==1) { strcpy(s[j],t); j++; } 19 | qsort(s,j,sizeof(s[0]),strcmp); 20 | int i; 21 | // for(i=0;i=0;i--){ 24 | /// s[i]; 25 | ///check s[i] in list or not? 26 | int find=0; 27 | NODE* p=head; 28 | while(p!=NULL){ 29 | if(strcmp(p->str,s[i])==0){ /// existed s[i] freq++ 30 | find=1; 31 | p->freq++; 32 | break; 33 | } 34 | p=p->next; 35 | } 36 | if(find==0){///no exsited create node {s[i],1,NULL} as list head; 37 | NODE* q=(NODE*)malloc(sizeof(NODE)); 38 | assert(q!=NULL); 39 | strcpy(q->str,s[i]); 40 | q->freq=1; 41 | q->next=NULL; 42 | q->next=head; 43 | head=q; 44 | } 45 | } 46 | printf("%d\n",j); 47 | NODE* p=head; 48 | while(p!=NULL){ 49 | printf("%s:%d\n",p->str,p->freq); 50 | p=p->next; 51 | 52 | } 53 | return 0; 54 | } 55 | -------------------------------------------------------------------------------- /lec19/1221.in: -------------------------------------------------------------------------------- 1 | to know everything is to know nothing 2 | -------------------------------------------------------------------------------- /lec19/assert.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec19/assert.c -------------------------------------------------------------------------------- /lec19/list.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | typedef struct node{ 4 | int data; 5 | struct node* next; 6 | }NODE; 7 | NODE* head; 8 | int main() 9 | { 10 | printf("%d\n",sizeof(NODE)); 11 | NODE* p=(NODE*)malloc(sizeof(NODE)); 12 | assert(p!=NULL); 13 | 14 | 15 | return 0; 16 | } 17 | -------------------------------------------------------------------------------- /lec19/outline.MD: -------------------------------------------------------------------------------- 1 | list 2 | -------------------------------------------------------------------------------- /lec19/root2.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int main() 4 | { 5 | int a,b,c; 6 | scanf("%d%d%d",&a,&b,&c); 7 | assert(a!=0); 8 | double delta=b*b-4*a*c; 9 | assert(delta>=0); 10 | double x1=(-b+sqrt(delta))/(2*a); 11 | double x2=(-b-sqrt(delta))/(2*a); 12 | printf("%.2f %.2f\n",x1,x2); 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /lec19/sortString.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec19/sortString.c -------------------------------------------------------------------------------- /lec19/unitTest.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | int add(int a,int b){ 4 | return a+b; 5 | } 6 | 7 | int main() 8 | { 9 | assert(3==add(1,2)); 10 | int a,b; 11 | scanf("%d%d",&a,&b); 12 | printf("%d\n",add(a,b)); 13 | return 0; 14 | } 15 | 16 | 17 | -------------------------------------------------------------------------------- /lec20/1584.c: -------------------------------------------------------------------------------- 1 | #include 2 | char M[51][51]; 3 | 4 | int main() { 5 | freopen("1584.in", "r", stdin); 6 | int n, m; 7 | scanf("%d%d", &n, &m); 8 | int i, j, r, c; 9 | for (i = 0; i < n; i++) scanf("%s", M[i]); 10 | int max = 0; 11 | for (i = 0; i < n; i++) 12 | for (j = 0; j < m; j++) { 13 | if (M[i][j] == '.') { 14 | int curMax = 0; 15 | 16 | for (r = i - 1; r >= 0; r--) { 17 | if (M[r][j] == '#') break; 18 | if (M[r][j] == 'G') ++curMax; 19 | } 20 | for (r = i + 1; r < n; r++) { 21 | if (M[r][j] == '#') break; 22 | if (M[r][j] == 'G') ++curMax; 23 | } 24 | for (c = j - 1; c >= 0; c--) { 25 | if (M[i][c] == '#') break; 26 | if (M[i][c] == 'G') ++curMax; 27 | } 28 | for (c = j + 1; c < m; c++) { 29 | if (M[i][c] == '#') break; 30 | if (M[i][c] == 'G') ++curMax; 31 | } 32 | if (curMax > max) max = curMax; 33 | } 34 | } 35 | printf("%d\n", max); 36 | return 0; 37 | } 38 | -------------------------------------------------------------------------------- /lec20/2030.c: -------------------------------------------------------------------------------- 1 | #include 2 | char M[101][101]; 3 | 4 | int main() { 5 | freopen("2030.in", "r", stdin); 6 | int n, m; 7 | scanf("%d%d", &n, &m); 8 | int i, j, x, y; 9 | for (i = 0; i < n; i++) scanf("%s", M[i]); 10 | 11 | for (i = 0; i < n; i++) 12 | for (j = 0; j < m; j++) { 13 | if (M[i][j] == '#') continue; 14 | if (M[i][j] == '.') { 15 | int tot = 0; 16 | for (x = i - 1; x <= i + 1; x++) 17 | for (y = j - 1; y <= j + 1; y++) { 18 | if (x >= 0 && x < n && y >= 0 && y < m && M[x][y] == '#') ++tot; 19 | } 20 | M[i][j] = tot + '0'; 21 | } 22 | } 23 | for (i = 0; i < n; i++) 24 | for (j = 0; j < m; j++) 25 | if (M[i][j] == '#') M[i][j] = '0'; 26 | for (i = 0; i < n; i++) puts(M[i]); 27 | return 0; 28 | } 29 | -------------------------------------------------------------------------------- /lec20/arr2d.c: -------------------------------------------------------------------------------- 1 | #include 2 | int main() { 3 | int a[3][4] = {0}; 4 | a[0][7] = 9; 5 | a[0 + 7 / 4][7 % 4] = 9; 6 | int b[][3] = {1, 2, 3, 4, 4}; 7 | int c[][4] = {1, 2, 3, 4}; 8 | } 9 | -------------------------------------------------------------------------------- /lec20/outline.md: -------------------------------------------------------------------------------- 1 | arr2d 2 | -------------------------------------------------------------------------------- /lec20/sort2.c: -------------------------------------------------------------------------------- 1 | typedef struct { 2 | char *str; 3 | int freq; 4 | 5 | } Node; 6 | 7 | int cmp(const void *a, const void *b) { 8 | Node *na = (Node *)(a); 9 | Node *nb = (Node *)(b); 10 | return strcmp(na->str, nb->str); 11 | } 12 | int main() { 13 | Node a = {"zero", 1}; 14 | Node b = {"is", 1}; 15 | int dif = cmp(&a, &b); 16 | printf("%d\n", dif); 17 | } 18 | -------------------------------------------------------------------------------- /lec20/strSort.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | int main() { 5 | char s[10][100] = {"zero", "one", "two", "three", "four", 6 | "five", "six", "seven", "eight", "nine"}; 7 | qsort(s, 10, sizeof(s[0]), strcmp); 8 | int i; 9 | for (i = 0; i < 10; i++) puts(s[i]); 10 | 11 | return 0; 12 | } 13 | -------------------------------------------------------------------------------- /lec20/strSort2.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec20/strSort2.c -------------------------------------------------------------------------------- /lec21/gcd.c: -------------------------------------------------------------------------------- 1 | #include 2 | int gcd_poor(int a,int b) 3 | { 4 | int c; 5 | for(c=a+b; c>=1; c--) 6 | { 7 | if(a%c==0&&b%c==0) 8 | return c; 9 | } 10 | return 1; 11 | 12 | } 13 | int gcd_soso(int a,int b){ 14 | int r=a%b; 15 | if(r==0) 16 | return b; 17 | while(r!=0){ 18 | a=b; 19 | b=r; 20 | r=a%b; 21 | } 22 | return a; 23 | } 24 | int gcd(int a,int b){ return b?gcd(b,a%b):a; } 25 | int main() 26 | { 27 | int r=gcd_poor(12,8); 28 | printf("%d\n",r); 29 | } 30 | -------------------------------------------------------------------------------- /lec21/intLen.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec21/intLen.c -------------------------------------------------------------------------------- /lec21/mod.c: -------------------------------------------------------------------------------- 1 | #include 2 | int mod(int a,int b){ 3 | int x=a%b; 4 | if(x>=0) 5 | return x; 6 | else 7 | return x+b; 8 | 9 | } 10 | int main() 11 | { 12 | int n=-17; 13 | printf("%d\n",n%3); 14 | printf("%d\n",mod(n,3)); 15 | } 16 | -------------------------------------------------------------------------------- /lec21/outline.md: -------------------------------------------------------------------------------- 1 | # 数论算法 2 | 3 | @author [ZHAO Jing]( zj@webturing.com) 4 | 5 | 6 | 7 | ## 基本概念 8 | 9 | - **整除性**: 10 | 11 | - 若整数$d$ 是整数$n$的因子,即$\exists t \in \mathbb{Z}$ 满足$ dt=n$记作为$d \mid n$。 12 | - 反之$d \nmid n$ 13 | - **素数**: 14 | 15 | - 若$\forall x :2\le x \le n-1$ 都有$ x\nmid n $则$n$是素数 16 | - 反之称n是**合数** 17 | - 特别的规定 1不是素数 18 | - **除法定理** 19 | 20 | - 对于任何整数$a$ 存在唯一的证书$q$和$r$ 满足 $0\le r \lt n$ 且$a=qm+r$ 21 | - 称 $q =\lfloor a/n \rfloor$ 为**商** $r=a \mod n$ 为**余数** 22 | - 如果 $n \mid (a-b)$ 称$a$ $b$ 对于$n$同余 记为 $ a \equiv b \mod n$ 23 | - 公约数和最大公约数GCD 24 | 25 | - 若$d \mid a $ 且$d\mid b$ , 则$d$为$a$ 和$b$公约数 26 | - 所有$d$中最大的称为**最大公约数GCD** 记为$gcd(a,b)$ 27 | - 特别的如果 $gcd(a,b)=1$称 a,b**互质** 28 | - 公倍数和最小公倍数LCM 29 | 30 | - 若$a \mid d $ 且$b\mid d$ , 则$d$为$a$ 和$b$公倍数 31 | - 所有$d$中最小的称为**最小公倍数LCM**记为$lcm(a,b)$ 32 | - 唯一因子分解定理 33 | - 合数$a​$仅有一种方式写成如下的乘积形式$ a= p_1^{e_1}p_2^{e_2}p_3^{e_3}...p_r^{e_r}​$其中 $p_i​$是质数 且$p_1 2 | int main() 3 | { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /lec21/rationalize.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webturing/CProgrammingII_17CS123/182d01dcb1c8cdbffbc599e374046265e222f49f/lec21/rationalize.c --------------------------------------------------------------------------------