[置顶] C语言经典小程序(热门题型)

摘要:提及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>



★2.判断一个数能否写成2的次方幂的形式

<span style="color:#000099;">bool compare(int x)
{
	if ((x&(x - 1)) == 0) 
        return true;
        else
	return false;
}</span>



★3.统计一个数的二进制序列中位为1的个数

<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>


★6.实现N^K(递归实现)

<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>


★8.折半查找

<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>



★9.输出9*9乘法口诀表

<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>



★10.判断一个数是不是素数

<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,移除的高位舍去,右移相反。






你可能感兴趣的:(C语言常见小函数,C语言经典小程序,面试笔试常见小题型)