/** #include <stdio.h> #include <stdlib.h> int max(int n1, int n2) { return (n1 > n2) ? n1 : n2; } int main() { int a, b, c; if(a == max(a, b)) { if(a == max(a, c)) printf("%d ", a); else if(c == max(b, c)) printf("%d ", c); else printf("%d ", b); } return 0; } */ /**失误代码告诉我,不要尝试抖机灵。。。,越写越垃圾。。。*/ ///能正确实现功能的程序,就是好程序 /** #include <stdio.h> #include <stdlib.h> int main() { int a, b, c; scanf("%d %d %d",&a, &b, &c); if(a > b) { if(a > c) printf("%d ", a); else{ printf("%d ", c); } }else{ if(b > c) printf("%d ", b); else{ printf("%d ", c); } } return 0; } */ /** #include <stdio.h> #include <stdlib.h> int judge_year(int y) { if((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) return 1; return 0; } int main() { int year; scanf("%d", &year); if(judge_year(year)) { puts("leap year!"); }else{ puts("nonleap year"); } return 0; } */ /** #include <stdio.h> #include <stdlib.h> double sum_decimals(int n) { int i; double sum = 0; for(i = 1; i <= n; ++i) if(i % 2 == 0) sum += -(1.0/i); else sum += 1.0/i; return sum; } int main() { int n; scanf("%d", &n); printf("%f ", sum_decimals(n)); return 0; } */ /** ///要注意的地方是,乘号,不要忘记了,从数学公式到程序,这个容易丢 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int a, b, c; double area, p; scanf("%d %d %d", &a, &b, &c); if(a+b > c && b+c > a && a+c > b) { p = (a+b+c+0.0)/2; area = sqrt(p*(p-a)*(p-b)*(p-c)); printf("%f ", area); }else{ printf("Do not construct triangle"); } return 0; } */ /** //char int 存储数据时的区别 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { char c1 = 197, c2 = 198; printf("%c %c ", c1, c2); printf("%d %d", c1, c2); return 0; } */ /** //逻辑运算符的结合性都是自左向右的,而且逻辑运算符有短路特性 #include <stdio.h> #include <stdlib.h> #include <math.h> int judge(int n, int a, int b, int c) { int x, y; if(n == 1) { if(a || b+c && b-c) return 1; }else if(n == 2){ if(!(a>b) && !c || 1) return 1; }else if(n == 3){ if(!(x=a) && (y=b) && 0) return 1; }else if(n == 4){ if(!(a+b)+c-1 && b+c/2) return 1; } return 0; } int main() { int i; for(i = 1; i < 5; ++i) { if(judge(i, 3, 4, 5)) puts("yes"); else puts("no"); } return 0; } */ /** ///在switch case语句中的要点,在switch括号中的变量,只能是int / char类型 ///在case后边的,只能是对应的int / char值 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int score; scanf("%d", &score); switch(score/10) { case 10: puts("A"); break; case 9 : puts("B"); break; case 8 : puts("C"); break; default: puts("D"); } return 0; } */ /** ///递归写的时候,注意递归基,和递归结束条件。把握好这两点,递归就行 #include <stdio.h> #include <stdlib.h> #include <math.h> int fabonacci(int n) { if(n == 1 || n == 2) return 1; else return fabonacci(n-1)+fabonacci(n-2); } int main() { printf("%d %d ", 8, fabonacci(8)); return 0; } */ /** ///这道题没什么好说的,很简单 #include <stdio.h> #include <stdlib.h> #include <math.h> int num(int i, int base) { int j; for(j = 0; j < i-1; ++j) { base = base*10 + base%10; printf("%d ", base); } return base; } int main() { int n = 5, sum = 0, i; for(i = 1; i <= 5; ++i) { sum += num(i, 2); printf("%d ", sum); } return 0; } */ /** //书上竟然有这样的题目。。。 用int型的话,阶乘达不到20!,就会超出int范围,所以用long long型,注意,long long型输出用 %lld #include <stdio.h> #include <stdlib.h> #include <math.h> long long factorial(long long n) { long long i , fac = 1; for(i = 1; i <= n; ++i) { fac = fac * i; } return fac; } long long main() { long long sum = 0, i; for(i = 1; i <= 20; ++i) { sum += factorial(i); printf("%lld ", sum); } return 0; } */ /** ///久违的水仙花数 ///写程序的时候注意,如果函数的形参可以不动,尽量不动。因为改动了之后,就找不回了,程序运行完成之后,它会被释放掉 #include <stdio.h> #include <stdlib.h> #include <math.h> int cude(int n) { return n*n*n; } int judge_num(int n) { int bit[3], i = 0, tmp = n; while(tmp) { bit[i] = tmp % 10; tmp /= 10; i++; } if(n == (cude(bit[0]) + cude(bit[1]) + cude(bit[2]))) { return 1; } return 0; } int main() { int i; for(i = 100; i < 1000; ++i) { if(judge_num(i)) printf("%d is! ", i); } return 0; } */ /** //不说了,很简单 #include <stdio.h> #include <stdlib.h> #include <math.h> int judge(int n) { int i, fac_sum = 0; for(i = 1; i < n; ++i) { if(n % i == 0) fac_sum += i; } if(n == fac_sum) return 1; return 0; } int main() { int i; for(i = 1; i <= 1000; ++i) { if(judge(i)) { printf("%d! ", i); } } return 0; } */ /** ///斐波那契数列的变形 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i, n1 = 1, n2 = 1, tmp; double sum = 0; for(i = 0; i < 20; ++i) { tmp = n1 + n2; printf("%f ", (tmp+0.0) / n2); sum += (tmp+0.0) / n2; n1 = n2; n2 = tmp; } printf("%f ", sum); return 0; } */ /** ///牛顿迭代法求根,这个要记住 ///这个程序,除了记住牛顿迭代法的方法外,还要注意, double类型要用 %lf 进行读入 #include <stdio.h> #include <stdlib.h> #include <math.h> double my_sqrt(double n) { double a1 = 2, a2 = 0, tmp; while(fabs(a1 - a2) > 0.00001) { a2 = 0.5*(a1 + n/a1); //printf("%f ", n); //printf("%f %f %f ", a1, a2, tmp); tmp = a2; a2 = a1; a1 = tmp; } return a1; } int main() { double n1; while(scanf("%lf", &n1) != EOF) printf("%f ", my_sqrt(n1)); return 0; } */ /** ///注意,字符串的大小是根据 “字典序” 来定义的,这里我用指针写了写 #include <stdio.h> #include <string.h> int judge_str(char *str1, char *str2) { int i, len1 = strlen(str1), len2 = strlen(str2); for(i = 0; i < len1 && i < len2; ++i) { if(*(str1 + i) < *(str2 + i)) return 1; else if(*(str1 + i ) > *(str2 + i)) return -1; } return 0; } int main() { int i,j; char str[3][10] = {"china", "japan", "indin"}, *max; for(i = 0; i < 3; ++i) { for(j = i+1; j < 3; ++j) { if(judge_str(str[i], str[j]) == 1) { max = str[i]; } } } puts(max); return 0; } */ /** ///简单选择排序 #include <stdio.h> #include <stdlib.h> #include <math.h> void swap(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } void select_sort(int *arr, int n) { int i, j, index; for(i = 0; i < n; ++i) { index = i; for(j = i+1; j < n; ++j) { if(arr[j] > arr[index]) { index = j; } } if(index != i) { swap(&arr[i], &arr[index]); } } } int main() { int i, arr[10] = {1, 4, 5, 6, 8, 7, 9, 0, 2, 3}; select_sort(arr, 10); for(i = 0; i < 10; ++i) { printf("%d ", arr[i]); } puts(""); return 0; } */ /** ///冒泡排序 #include <stdio.h> #include <stdlib.h> #include <math.h> void swap(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } void bubble_sort(int *arr, int n) { int i, j; for(i = 0; i < n; ++i) { for(j = i+1; j < n; ++j) { if(arr[i] > arr[j]) swap(&arr[i], &arr[j]); ///上边写的,这里就错了,总是忘了 '&' 符号,注意,注意 } } } int main() { int i, arr[10] = {1, 4, 5, 6, 8, 7, 9, 0, 2, 3}; bubble_sort(arr, 10); for(i = 0; i < 10; ++i) { printf("%d ", arr[i]); } puts(""); return 0; return 0; } */ /** ///将一个数,插入到已经有序的数组中 #include <stdio.h> #include <stdlib.h> #include <math.h> void insert_num(int *arr, int n, int num) { int i, j; for(i = 0; i < n; ++i) { if(num < arr[0]) break; if(num >= arr[i] && num < arr[i+1]) ///注意这里的写法, break; } for( j = n; j > i; --j) { arr[j] = arr[j-1]; } arr[i] = num; } void print_arr(int *arr, int n) { int i; for(i = 0; i < n; ++i) { printf("%d ", arr[i]); } } int main() { int arr[10] = {2, 3, 4, 5, 5, 7, 8}; insert_num(arr, 7, 9); print_arr(arr, 8); return 0; } */ /** ///将数组中的数,逆序排放 #include <stdio.h> #include <stdlib.h> #include <math.h> void swap(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } void print_arr(int *arr, int n) { int i; for(i = 0; i < n; ++i) { printf("%d ", arr[i]); } } void inverst_arr(int *arr, int n) { int i; for(i = 0; i < n/2; ++i) { swap(&arr[i], &arr[n-i-1]); } } int main() { int arr[10] = {2, 3, 4, 5, 5, 7, 8}; inverst_arr(arr, 10); print_arr(arr, 10); return 0; } */ /** ///杨辉三角,前10行 #include <stdio.h> #include <stdlib.h> #include <math.h> void printf_yh_triangle() { int i, j, arr[10][10] = {{1}, {1,1}}; printf("%d ", arr[0][0]); for(i = 1; i < 10; ++i) { for(j = 0; j <= i; ++j) { if(j == 0 || j == i) { arr[i][j] = 1; printf("%d ", arr[i][j]); } else{ arr[i][j] = arr[i-1][j-1] + arr[i-1][j]; printf("%d ", arr[i][j]); } } puts(""); } } int main() { printf_yh_triangle(); return 0; } */ /** ///1~n*n 构成的魔方阵 ///dfs 的写法 4*4 就跑不动了。。。。。。 ///其他写法呢?? -> http://blog.csdn.net/cmutoo/article/details/5487157 #include <stdio.h> #include <stdlib.h> #include <math.h> #define N 3 int vis[10000]; int judge(int arr[][N], int n) { int i, j, a[10] = {0}, b[10] = {0}, x1 = 0, x2 = 0; for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) { a[i] += arr[i][j]; } } for(i = 0; i < n-1; ++i) { if(a[i] != a[i+1]) return 0; } for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) { b[i] += arr[j][i]; } } for(i = 0; i < n-1; ++i) { if(b[i] != b[i+1]) return 0; } for(i = 0; i < n; ++i) { x1 += arr[i][i]; } for(i = 0; i < n; ++i) { x2 += arr[n-i-1][i]; } if(a[0] == b[0] && b[0] == x1 && x1 == x2) return 1; return 0; } void print_dfs(int arr[][N]) { int i, j; for(i = 0; i < N; ++i) { for(j = 0; j < N; ++j) { printf("%d ", arr[i][j]); } puts(""); } puts(""); } void dfs(int arr[][N], int n, int num) { int row = num / n; int col = num % n; int i; if(row > n-1) return; for(i = 1; i <= N*N; ++i) { if(!vis[i] && arr[row][col] == 0) { vis[i] = 1; arr[row][col] = i; if(row == col && row == n-1 && judge(arr, N) == 1) { print_dfs(arr); } dfs(arr, n, num+1); arr[row][col] = 0; vis[i] = 0; } } } int main() { int i, brr[N][N] = {0}; //arr[3][3] = {{8,1,6}, {3,5,7}, {4,9,2}}; memset(vis, 0, sizeof(vis)); for(i = 1; i <= N*N; ++i) { dfs(brr, N, i-1); } return 0; } */ ///奇幻方阵的构造方法 /** 奇数阶幻方 最经典的填法是罗伯特法(楼梯法),填写方法是这样: 把1(或最小的数)放在第一行正中;按以下规律排列剩下的n×n-1个数: (1)每一个数放在前一个数的右上一格; (2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列; (3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行; (4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内; (5)如果这个数所要放的格已经有数填入,处理方法同(4)。 这种写法总是先向“右上”的方向,象是在爬楼梯。 三阶幻方: 8 1 6 3 5 7 4 9 2 */ // 解奇阶幻方的通用模块 ///写了这么多,也就这点价值高********************************************************** /** #include <stdio.h> #include <stdlib.h> #include <math.h> #define N 100 int main() { int arr[N][N] = {0}; int n, x, y, i, j; scanf("%d", &n); x = n / 2; y = 0; for(i = 1; i <= n*n; ++i) { arr[y][x] = i; if(i%n == 0) y++; else { x++; y--; } x = (x%n + n) % n; ///存在负数时,取模的方法 y = (y%n + n) % n; } for(i = 0; i < n; ++i) { for(j = 0; j < n; ++j) { printf("%d ", arr[i][j]); } puts(""); } puts(""); return 0; } */ /** ///找一个二位数组中的鞍点(可能不存在) #include <stdio.h> #include <stdlib.h> #include <math.h> int judge(int arr[][4], int num, int row, int col) { int i = 0; for(i = 0; i < 4; ++i) { if(num < arr[row][i]) return 0; if(num > arr[i][col]) return 0; } return 1; } int main() { int i, j, max, min; int arr[4][4] = {{1,2,3,4}, {5,6,7,8}, {2,3,4,5}, {6,7,8,9}}; for(i = 0; i < 4; ++i) { for(j = 0; j < 4; ++j) { if(judge(arr, arr[i][j], i, j)) { printf("%d %d %d ",i, j, arr[i][j]); } } } return 0; } */ /** ///二分查找,写最简单的就好了 #include <stdio.h> #include <stdlib.h> #include <math.h> int binary_find(int *arr, int n, int num) { int low, high, mid; low = 0; high = n-1; while(low < high) { //printf("%d %d %d ", low, mid, high); mid = (low+high) / 2; if(arr[mid] == num) return mid+1; else if(num > arr[mid]) low = mid; else high = mid; } return -1; } int main() { int arry[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; int index = binary_find(arry, 20, 4); if(index) { printf("%d ", index); }else{ puts("Not Found!"); } return 0; } */ /** ///P.169 连接两个字符串,不用strcat #include <stdio.h> #include <stdlib.h> #include <math.h> int get_str_len(char *str) { int len = 0; while(str[len] != ' ') len++; return len; } ///源码写法,好强 char *str_cat(char *s1, const char *s2) { char *s; for(s = s1; *s != ' '; ++s) ; for(; (*s = *s2) != ' '; ++s, ++s2) ; return s1; } int main() { char str1[100], str2[100]; scanf("%s %s", str1, str2); ///将str2 连接在 str1的后边 int i, j; int len1 = get_str_len(str1); int len2 = get_str_len(str2); for(i = len1, j = 0; j < len2;) { str1[i++] = str2[j++]; } str1[i] = ' '; puts(str1); //-------------- str_cat(str1, str2); puts(str1); return 0; } */ /** #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> int get_str_len(char *str) { int len = 0; while(str[len] != ' ') len++; return len; } ///学会这种写法,很nice int str_cmp(const char *str1,const char *str2) { //不可用while(*str1++==*str2++)来比较,当不相等时仍会执行一次++, //return返回的比较值实际上是下一个字符。应将++放到循环体中进行。 // while(*str1 == *str2) // { // if(*str1 == ' ') // return 0; // // str1++; // str2++; // } ///用for写的近似于ASCI C源码 for(;*str1 == *str2; ++str1, ++str2) if(*str1 == ' ') return 0; return *str1 - *str2; } int main() { char str1[100], str2[100]; gets(str1); gets(str2); int len1 = get_str_len(str1); int len2 = get_str_len(str2); printf("%d ", str_cmp(str1, str2)); return 0; } */ /** #include <stdio.h> #include <stdlib.h> #include <math.h> ///源码写法,简直优美!! char *str_cpy(char *s1, const char *s2) { char *s; for(s = s1; (*s++ = *s2++) != ' '; ) ; return s1; } int main() { char str1[100], str2[100]; gets(str2); str_cpy(str1, str2); puts(str1); return 0; } */ /** ///练练hanoi塔的写法,会写还是很简单的 ///课本P 190 #include <stdio.h> void move(char a, char c) { printf("%c -> %c ", a, c); } void hanoi(int n, char a, char b, char c) { if(n == 1) move(a, c); else{ hanoi(n-1, a, c, b); move(a, c); hanoi(n-1, b, a, c); } } int main() { char A = 'A', B = 'B', C = 'C'; hanoi(3, A, B, C); return 0; } ///搞定 */ /** ///求最大公约数,最小公倍数, #include <stdio.h> #include <stdlib.h> #include <math.h> ///这种实现很简单 int gcd(int a, int b) { if(b == 0) return a; else return gcd(b, a%b); } int lcm(int a, int b) { return (a*b)/(gcd(a, b)); } int main() { int n1, n2; scanf("%d %d", &n1, &n2); printf("%d %d ", gcd(n1, n2), lcm(n1, n2)); return 0; } */ /** ///将矩阵转置 #include <stdio.h> #include <stdlib.h> #include <math.h> void trans(int arr[3][3]) { int i, j, tmp; for(i = 0; i < 3; ++i) { for(j = i; j < 3; ++j) { tmp = arr[j][i]; arr[j][i] = arr[i][j]; arr[i][j] = tmp; } } } int main() { int i,j; int a[3][3] = {0,1,2,3,4,5,6,7,8}; trans(a); for(i = 0; i < 3; ++i) { for(j = 0; j < 3; ++j) printf("%d ", a[i][j]); puts(""); } return 0; } */ /** ///字符串反转 #include <stdio.h> #include <stdlib.h> #include <math.h> void str_reversed(char *str) { int i; char tmp; int len = strlen(str); for(i = 0; i < len/2; ++i) { tmp = str[len-i-1]; str[len-i-1] = str[i]; str[i] = tmp; } } int main() { char str[] = "qwerqwer"; str_reversed(str); puts(str); return 0; } */ /** ///统计字符串中各种元素的个数 #include <stdio.h> #include <stdlib.h> #include <math.h> int num1 = 0, num2 = 0, num3 = 0; void statistics(char *str) { while(*str != ' ') { if((*str >= 'a' && *str <= 'z') || (*str >= 'A' && *str <= 'Z')) { num1 ++; } else if((*str >= '0' && *str <= '9')) { num2 ++; } else if (*str == ' '){ num3 ++; } str++; } } int main() { char str[] = "China is a beautiful country 23333!"; statistics(str); printf("%d %d %d ", num1, num2, num3); return 0; } */ /** ///冒泡排序,最基本的交换排序 #include <stdio.h> #include <stdlib.h> #include <math.h> void bubble_sort(char *str, int len) { int i, j; char tmp; for(i = 0; i < len; ++i) { for(j = i; j < len; ++j) { if(str[i] > str[j]) { tmp = str[i]; str[i] = str[j]; str[j] = tmp; } } } } int main() { char str[] = "asdfvjkloi"; bubble_sort(str, 10); puts(str); return 0; } */ /**/ ///用递归,将数字转化为字符串 #include <stdio.h> #include <stdlib.h> #include <math.h> void int_to_str(int num, char *str) { int tmp; if(num / 10 == 0) { *str = num + '0'; str++; *str = ' '; } else { tmp = num / 10; *str = num % 10 + '0'; str++; *str = ' '; int_to_str(tmp, str); } } int main() { int num, i; scanf("%d", &num); char str[100]; int_to_str(num, str); int len = strlen(str); for(i = len-1; i >= 0; --i) putchar(str[i]); puts(""); return 0; }