摘要:提及C语言,许多人都觉得不难。但是在笔试或者面试时,总会在一些不经意的小程序或简单功能的函数难住,所以说C语言虽然没有Cplusplus的深度,但其广度丝毫不亚于C++,对于面向过程的高级语言来说,C语言的细枝末节可谓浪里淘沙,在此总结列举少许较为常见的。
★1.求两个数的平均值(不能使用(a+b)/2的方式)
int Average(int x, int y)
{
return x&y + ((x^y) >> 1); //用(a+b)/2的方式,在相加的过程中容易造成数据溢出
}
bool compare(int x)
{
if ((x&(x - 1)) == 0)
return true;
else
return false;
}
int Count_one_bit(int x)
{ int count=0;
while(x)
{ count++; //注意若要扩大范围,可将数据类型扩升至unsigned int或者long long型
x=x&(x-1);
}
return count;
}
★4.斐波那契数列的实现(递归&非递归)
①递归:
unsigned int Fib(unsigned int num)
{
if (num == 1 || num == 2)
return num;
else
return Fib(num - 1) + Fib(num - 2);
}
②非递归:
#include
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;
}
★5.冒泡排序(排序整型数组)
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;
}
}
}
}
int fun(int a, int b)
{
if (b != 1)
{
return a*fun(a, b - 1);
}
return 1;
}
★7.在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'。
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';
}
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;
}
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");
}
}
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);
}
}
(1)、按位与(&),将两个操作数化为二进制后并将对应的每一位分别进行逻辑与操作。(a % (2 ^ n) = a&(2 ^ n - 1))
(2)、按位或(| ),将两个操作数化为二进制后并将对应的每一位分别进行逻辑或操作。
(3)、按位异或(^),和以上同,异或是指对应位相同则运算结果为0,否则为1。
(4)、按位取反(~),对每一位进行取反。(求x的相反数:x = (~x + 1))。
(5)、移位。分为左移(<< )和右移(>> ),左移是按照指定的位数将一个数的二进制值向左移位,左移后,低位补0,移除的高位舍去,右移相反。