摘要:提及C语言,许多人都觉得不难。但是在笔试或者面试时,总会在一些不经意的小程序或简单功能的函数难住,所以说C语言虽然没有Cplusplus的深度,但其广度丝毫不亚于C++,对于面向过程的高级语言来说,C语言的细枝末节可谓浪里淘沙,在此总结列举少许较为常见的。
★1.求两个数的平均值(不能使用(a+b)/2的方式)
<span style="color:#000099;">int Average(int x, int y) { return x&y + ((x^y) >> 1); //用(a+b)/2的方式,在相加的过程中容易造成数据溢出 }</span>
<span style="color:#000099;">bool compare(int x) { if ((x&(x - 1)) == 0) return true; else return false; }</span>
<span style="color:#000099;"> int Count_one_bit(int x) { int count=0; while(x) { count++; //注意若要扩大范围,可将数据类型扩升至unsigned int或者long long型 x=x&(x-1); } return count; } </span>
★4.斐波那契数列的实现(递归&非递归)
①递归:
<span style="color:#000099;">unsigned int Fib(unsigned int num) { if (num == 1 || num == 2) return num; else return Fib(num - 1) + Fib(num - 2); }</span>
②非递归:
<span style="color:#000099;">#include<iostream> using namespace std; int arr[50];//静态存储,局限性大 //int* ptr = new int[50];//动态开辟,可修改上限 int& Fib(int i) { return arr[i]; //return ptr[i]; } int main() { arr[0] = 0; //ptr[0]=0; //ptr[1]=1; arr[1] = 1; long long num = 0; cout << "请输入要显示的个数:" << endl; cin >> num; for (size_t i = 2; i < num; i++) { Fib(i) = Fib(i - 1) + Fib(i - 2); } for (size_t i = 0; i < num; i++) { cout << arr[i] << " "; //cout << ptr[i] << " "; } cout << endl; //delete[] ptr; //动态开辟切记delete,否则内存泄漏 return 0; }</span>
★5.冒泡排序(排序整型数组)
<span style="color:#000099;">void bub_sort(int arr[], int size) { int i = 0, j = 0; int tmp = 0; for (i = 0; i < size - 1; i++) { for (j = 0; j < size - 1 - i; j++) { if (arr[j] > arr[j + 1]) { tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } }</span>
<span style="color:#000099;">int fun(int a, int b) { if (b != 1) { return a*fun(a, b - 1); } return 1; }</span>
★7.在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'。
<span style="color:#000099;">char first_ch(char * str) { int asc[255] = { 0 }; int i = 0; for (i = 0; str[i] != '\0'; i++) { asc[str[i]]++; } for (i = 0; str[i] != '\0'; i++) { if (asc[str[i]] == 1) return str[i]; } return '\0'; }</span>
<span style="color:#000099;">int halfcheck(int num, int arr[], int size) { int left = 0, right = size - 1, mid = 0; while (left <= right) { mid = ((right-left)>>1)+left; if (num < arr[mid]) { right = mid - 1; } else if (num > arr[mid]) { left = mid + 1; } else { return mid; } } return -1; }</span>
<span style="color:#000099;">void fun(int num) { int i = 0; int j = 0; for (i = 1; i <= num; i++) { for (j = 1; j <= i; j++) { printf("%2d*%2d=%2d", i, j, i*j); } printf("\n"); } }</span>
<span style="color:#000099;">int fun_prime(int a) { int i = 0; if (a == 1) { printf("This number is not a prime!\n"); } for (i = 2; i <= sqrt(a); i++) { if (a%i == 0) { break; } } if (i <= sqrt(a)) { printf("%d is not a prime!\n", a); } else { printf("%d is a prime!\n", a); } }</span>
(1)、按位与(&),将两个操作数化为二进制后并将对应的每一位分别进行逻辑与操作。(a % (2 ^ n) = a&(2 ^ n - 1))
(2)、按位或(| ),将两个操作数化为二进制后并将对应的每一位分别进行逻辑或操作。
(3)、按位异或(^),和以上同,异或是指对应位相同则运算结果为0,否则为1。
(4)、按位取反(~),对每一位进行取反。(求x的相反数:x = (~x + 1))。
(5)、移位。分为左移(<< )和右移(>> ),左移是按照指定的位数将一个数的二进制值向左移位,左移后,低位补0,移除的高位舍去,右移相反。