1、递归
求阶乘n!
int function1(int n) { if (n == 0) return 1; while (n >= 1) { return n*function1(n - 1); } }
或
int function2(int n) { if (n == 0) return 1; else return n*function2(n - 1); }
2、输入一个整数(任意位数),倒叙输出:
//计算位数 int length_num(int n) { int num_temp = n; int flag = 0; while (num_temp > 0) { num_temp /= 10; flag++; } return flag; } //输入一个整数(任意位数),倒叙输出: int fun3(int n) { int flag = length_num(n); int *p = (int *)malloc(flag * sizeof(int)); for (int i = 0; i < flag; i++) { int temp = n % 10; *(p + i) = temp; n = n / 10; }//例如n=123,存储为321 int n1 = 0; for (int i = 0; i < flag; i++) { n1 = 10 * n1 + (*(p + i)); } free(p); return n1; }
3、将一个数组逆序放到原来数组中。(考虑复杂度)
void fun4(int *p, int length) { int n = length / 2; for(int i=0;i<n;i++) { int temp = *(p + i); *(p + i) = *(p + length - 1 - i); *(p + length - 1 - i) = temp; } }
4、斐波那契数列:
Fib(0) = 0
Fib(1) = 1
Fib(n) = Fib(n-1) + Fib(n-2)
F() = 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 …
//斐波那契,使用递归算法复杂度为 O(2n)。 int fun5(int n) { if (n == 0) return 0; if (n == 1) return 1; if (n > 1) return fun5(n - 1) + fun5(n - 2); } //斐波那契,不用递归,算法复杂度O(n) int fun6(int n) { if (n <= 1) return n; else { int forward1 = 0, forward2 = 1; int now = 0; for (int i = 1; i < n; i++) { now = forward1 + forward2; forward1 = forward2; forward2 = now; } return now; } }
5、排序
5.1冒泡排序
//冒泡排序,顺序 小---大,比较相邻数,每次循环后,最后的数总是最大 void sort1(int *a, int N) { for (int i = 0; i < N; i++) { for (int j = 0; j < N-1 - i; j++) { if (a[j + 1] < a[j]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } }//j }//i }
5.2、选择排序
//选择排序,每次选出i-N中最小值 void sort2(int *a, int N) { for (int i = 0; i < N; i++) { int min_flag = i; for (int j = i; j < N; j++) { if (a[min_flag] > a[j]) { min_flag = j; } } int temp = a[i]; a[i] = a[min_flag]; a[min_flag] = temp; } }
6、字符串循环移动
编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh” 函数头是这样的:
//pStr是指向以’\0’结尾的字符串的指针 //steps是要求移动的n void LoopMove ( char * pStr, int steps ) { //请填充… }
方法1:
//移动字符串循环1 void str_loop(char *p,int N,int loop_n) { //求数组长度,包括\0 int length = 0; for (int i = 0; i < N; i++) { length++; if (p[i] == '\0') break; } char * temp; temp = (char*)malloc(length * sizeof(char)); //求loop后的temp loop_n = loop_n % (length - 1); int j = 0; for (int i =length-loop_n ; i < length - 1; i++) { temp[j] = p[i]; j++; } for (int i = 0; i < length - loop_n; i++)//temp前半段赋值 { temp[j] = p[i]; j++; } temp[j] = '\0'; for (int i = 0; i < length; i++)//temp后半段赋值 { p[i] = temp[i]; } free(temp); }
方法2:使用字符串函数
//移动字符串循环2 void str_loop2(char *p, int loop_N) { int length = strlen(p);//不含\0 char *temp; temp = (char*)malloc(2*(length + 1) * sizeof(char));//保证temp内存大于p loop_N = loop_N%length; strcpy_s(temp,length+1, p+ length- loop_N); strcpy_s(temp + loop_N, length + 1, p); temp[length] = '\0'; strcpy_s(p, length + 1, temp); free(temp); }
7、计算字符串最后一个单词长度
//计算字符串中最后一个单词长度,空格为分割(字符串末尾可能有空格) int last_world_length(char *p) { int length = strlen(p); int count = 0; int t = length - 1; //排除第一个空格,如果有 if (p[length - 1] = ' ') { t--; } while (p[t]!=' ') { t--; count++; } return count; }
8、删除一个字符串中指定的所有某个字符。
联发科2017笔试题//删除字符串中某个字符 void delete_ch(char * str, char c) { char * temp; int length = strlen(str); temp = (char *)malloc((length + 1) * sizeof(char)); int j = 0; for (int i = 0; i < length; i++) { if (str[i] != c) { temp[j] = str[i]; j++; } }//i temp[j] = '\0'; printf("%s\n", temp); strcpy_s(str, length, temp); }
9、用一个表达式判断一个整数是否在某两个整数之间
//用一个表达式判断一个数b是否在两个数a,c之间 int between(unsigned int a, unsigned b, unsigned c) { return c - a > c - b; }10、