笔试题一大片

下面代码结果是什么

int main()
{
    
    
	int arr[] = {
    
     1, 2, (3, 4), 5 };
	printf("%d\n", sizeof(arr));//16
	
	return 0;
}

上面代码结果是16,因为(3,4)是逗号表达式,只看最
后面的那个数字

下面代码运行的结果是什么

int main()
{
    
    
	char str[] = "hello bit";
	printf("%d %d\n", sizeof(str), strlen(str));//10,9
	//sizeof(str)十个元素 hello空格bit\0 \0算一个元素 每个元素占了一个字节,所以10
	//strlen是9\0只是字符串的结束标志,并不能算作字符串的长度
	
	return 0;
}

上面代码的结果是 10,9
sizeof(str)十个元素 hello空格bit\0 \0算一个元素 每个元素占了一个字节,所以10
strlen是9 \0只是字符串的结束标志,并不能算作字符串的长度

数组元素个数认识

int main()
{
    
    
	char acX[] = "abcdefg";
	 //这里是8个元素后面还有一个\0
	char acY[] = {
    
     'a', 'b', 'c', 'd', 'e', 'f', 'g' };
	//这里是7个元素
	return 0;
}

创建一个整型数组,完成对数组的操作

1.实现函数init()初始化数组为全0

2.实现print()打印数组的每个元素

3.实现reverse()函数完成数组元素的逆置

//==初始化数组为0==
void init(int arr[],int sz)
{
    
    
	int i = 0;
	for (i = 0; i < sz; i++)
	{
    
    
		arr[i] = 0;
	}
}
//打印数组的函数
void Print(int arr[], int sz)
{
    
    
	int i = 0;
	for (i = 0; i < sz; i++)
	{
    
    
		printf("%d ", arr[i]);
	}
	printf("\n");
}
//对数组进行逆置函数
void reverse(int arr[], int sz)
{
    
    
	int left = 0;
	int right = sz - 1;
	while (left<right)
	{
    
    
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}
int main()
{
    
    
	int arr[10] = {
    
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//init(arr,sz);这里是将数组初始化为0
	Print(arr,sz);
	reverse(arr, sz);
	Print(arr, sz);
	return 0;
}

交换数组

将数组a中的内容和数组b中的内容交换一下

数组一样大

int main()
{
    
    
	int arr1[] = {
    
     1, 3, 5, 7, 9 };
	int arr2[] = {
    
     2, 4, 6, 8, 0 };
	int tmp = 0;
	int i = 0;
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	for (i = 0; i < sz; i++)
	{
    
    
		tmp = arr1[i];
		arr1[i] = arr2[i];
		arr2[i] = tmp;
	}
	return 0;
}

下面代码运行出来的结果

int main()
{
    
    
	int arr[] = {
    
     1, 2, 3, 4, 5 };
	short* p = (short*)arr;
	//short只能访问两个字节而一个int 1 就占用了4个字节
	int i = 0;
	for (i = 0; i < 4; i++)
	//所以这里循环了4次也只是访问了两个元素将两个元素换成了0
	{
    
    
		*(p + i) = 0;
	}
	for (i = 0; i < 5; i++)
	{
    
    
		printf("%d ", arr[i]);
		//所以这里的答案应该是00345
	}
	return 0;
}

下面代码运行出来的结果

int main()
{
    
    
	int a = 0x11223344;
	//在内存中是这样存储的 44 33 22 11 一个占一个字节一共4个字节441个331个221个11占1个字节
	char* pc = (char*)&a;
	*pc = 0;//这一步就相当于改成了 00 33 22 11这是在内存中存储的时候是这样的
	//但是拿出来是反的是 11 22 33 00
	printf("%x\n", a);//答案是:11 22 33 00
	return 0;
}

多注意上面这个代码中的注释部分

下面代码运行的结果是什么

int i;//i是全局变量,全局变量不初始化默认是0
int main()
{
    
    
	i--;
	/*
		i--之后就变成了-1
		-1
		原码10000000000000000000000000000001
		反码11111111111111111111111111111110
		补码11111111111111111111111111111111
	*/
	if (i > sizeof(i))   
//sizeof返回无符号数
//sizeof()-计算变量/类型所占内存大小 >=0 返回无符号数
//所以i在和无符号数比较大小它先变成无符号数 -1变成无符号数它的补码就会变成原码
		//那么这是一个非常大的数,所以它会比4大
	{
    
    
		printf(">\n");//答案是>
	}
	else
	{
    
    
		printf("<\n");
	}
	return 0;
}

全局变量,全局变量不初始化默认是0
sizeof返回无符号数

下面代码的结果是什么

int main()
{
    
    
	int a, b, c;
	a = 5;
	c = ++a; //a=6 c=6
	b = ++c, c++, ++a, a++;// c=8 b=7 a =8
	b += a++ + c;//b+=8+8 b+16=7+16 =23 //b=23 a=9 c=8
	printf("a=%d b=%d c=%d\n", a, b, c);
	//结果是;9 23 8
	return 0;
}

求二进制中不同位的个数

题目内容

编程实现:

两个int(32位)整数m和n的二进制表达式中,有多少个位(bit) 不同

输入例子

1999 2999

输出例子:7

int get_diff_bit(int m, int n)
{
    
    
	int count = 0;
	int tmp = m^n;
	while (tmp)
	{
    
    
		tmp = tmp&(tmp - 1);
		count++;
	}
	return count;
}
int main()
{
    
    
	int m = 0;
	int n = 0;
	scanf("%d%d", &m, &n);
	int count =get_diff_bit(m,n);
	printf("%d\n", count);
	return 0;
}

统计二进制中1的个数

写一个函数返回参数二进制中1的个数

比如:15 二进制是 00001111 4个1

第一种算法
int count_bit_one(unsigned int a)
{
    
    
	int count = 0;
	while (a)
	{
    
    
		if (a % 2 == 1)
		{
    
    
			count++;
		}
		a = a / 2;
	}
	return count;
}
第二种算法
int count_bit_one(int a)
{
    
    
	int count = 0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
    
    
		if (((a >> i) & 1) == 1)
		{
    
    
			count++;
		}
	}
	return count;
}
第三种算法 最经典的写法
int count_bit_one(int n)
{
    
    
	int count = 0;
	while (n)
	{
    
    
		n = n&(n - 1);
		count++;
	}
	return count;
}
/*
	n = n&(n-1)
	n
	13
	1101 n
	1100 n-1
	1000 n
	0111 n-1
	0000 n
*/
int main()
{
    
    
	int a = 0;
	scanf("%d", &a);
	//写一个函数求a的二进制(补码)表示中有几个1
	int count = count_bit_one(a);
	printf("%d\n", count);
	return 0;
}

题目名称 打印二进制的奇数位和偶数位

获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

void print(int m )
{
    
     
	int i = 0;
	printf("奇数位:\n");
	for (i = 30; i >= 0; i -= 2)
	{
    
    
		printf("%d ", (m >> i) & 1);
	}
	printf("\n");
	printf("偶数位:\n");
	for (i = 31; i >= 1; i -= 2)
	{
    
    
		printf("%d ", (m >> i) & 1);
	}
	printf("\n");
}
int main()
{
    
    
	int m = 0;
	scanf("%d", &m);
	print(m);
	return 0;
}

交换两个变量,不允许创建临时变量

int main()
{
    
    
	int a = 0;
	int b = 1;
	printf("交换前%d %d\n", a, b);
	a = a^b;
	b = a^b;
	a = a^b;
	printf("交换后%d %d\n", a, b);
	return 0;
}

使用指针打印数组内容

写一个函数打印arr数组的内容,不使用数组下标,使用指针

arr是一个整型一维数组

void print(int* arr, int sz)
{
    
    
	int i = 0;
	for (i = 0; i < sz; i++)
	{
    
    
		printf("%d ", *(arr + i));
	}
}
int main()
{
    
    
	int arr[10] = {
    
     1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr, sz);
	return 0;
}

下面开始递归递归常见题目问题

调用Fun(2)那么2就会进去下面代码

int Fun(int n)
{
    
    
	if (n == 5)
		return 2;
	else
		return 2 * Fun(n + 1);//最后返回值应该是16
}

函数判断素数

实现一个函数,判断一个数是不是素数

利用上面实现的函数打印100到200之间的素数

int is_prime(int n)
{
    
    
	int j = 0;
	for (j = 2; j < n; j++)
	{
    
    
		if (n%j == 0)
			return 0;
	}
	return  1;
}
int main()
{
    
    
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
    
    
		if (is_prime(i) == 1)
			printf("%d ", i);
	}
	return 0;
}

函数判断闰年

实现函数判断year是不是闰年

int is_leep_year(int x)
{
    
    
	if ((x % 4 == 0 && x % 100 != 0) || (x & 400 == 0))
		return 1;
	else
		return 0;
}
int main()
{
    
    
	int year = 0;
	scanf("%d", &year);
	if (is_leep_year(year) == 1)
	{
    
    
		printf("i=%d\n", year);
	}
	return 0;
}

题目名称:交换两个整数

实现一个函数来交换两个整数的内容


void Add(int* pa, int* pb)
{
    
    
	int tmp = 0;
	tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}
int main()
{
    
    
	int pa = 10;
	int pb = 20;
	printf("交换前 a=%d b=%d\n", pa, pb);
	Add(&pa, &pb);
	printf("交换后 a=%d b=%d\n", pa, pb);

	return 0;
}

实现一个函数,打印乘法口诀表,口诀表的行数和lli列数自己指定

如:输入9,输出99口诀表,输出1212的乘法口诀表

void print_table(int n)
{
    
    
	int i = 0;
	for (i = 1; i <= n; i++)
	{
    
    
		int j = 0;
		for (j = 1; j <= i ; j++)
		{
    
    
			printf("%d*%d = %d ", i, j, i*j);
		}
		printf("\n");
	}
}
int main()
{
    
    
	int n = 0;
	scanf("%d", &n);
	print_table(n);
	return 0;
}

打印一个数的每一位

题目内容

递归方式实现打印一个整数的每一位

void print(int num)
{
    
    
	if (num > 9)
	{
    
    
		print(num / 10);
	}
	print("%d ", num % 10);
}
int main()
{
    
    
	int num = 1234;
	print(num);
	return 0;
}

求阶乘

递归和非递归分别实现求n的阶乘(不考虑溢出的问题)

首先不用递归的方法

int print(int n)
{
    
    
	int a = 0;
	int b = 1;;
	for (a = 1; a <= n; a++)
	{
    
    
		b = b*a;
	}
	return b;
}
int main()
{
    
    
	int n = 0;
	int result = 0;
	scanf("%d", &n);
	result = print(n);
	printf("结果是:%d ", result);
	return 0;
}
用递归的方式进行阶乘
int print(int n)
{
    
    
	if (n <= 1)
		return 1;
	else
		return n*print(n - 1);
}
int main()
{
    
    
	int n = 0;
	int result = 0;
	scanf("%d", &n);
	result = print(n);
	printf("result = %d\n", result);
}

strlen的模拟(递归实现)

递归和非递归分别实现strlen

首先是不用递归实现的

int my_strlen(char* arr)
{
    
    
	int count = 0;
	while (*arr != '\0')
	{
    
    
		count++;
		arr++;
	}
	return count;
}
int main()
{
    
    
	char arr[] = "bitasdfasdf";
	int len = my_strlen(arr);
	printf("len =%d\n", len);
	return 0;
}

下面是用递归实现的

int my_strlen(char* str)
{
    
    
	if (*str != '\0')
	{
    
    
		return 1 + my_strlen(str + 1);
	}
	else
	{
    
    
		return 0;
	}
}
int main()
{
    
    
	char arr[] = "bitbitbitbytebyte";
	int len = my_strlen(arr);
	printf("len =%d\n", len);
	return 0;
}

题目名称 字符串逆序(递归实现)

编写一个函数reverse_string(char* string)(递归实现)

实现:将参数字符串中的字符反向排列

要求:不能使用c函数库中的字符串操作函数

int my_strlen(char* str)//采用计数器的方法,实现my_strlen
{
    
    
	int count = 0;
	while (*str != '\0')
	{
    
    
		count++;
		str++;
	}
	return count;
}
void reverse_string(char arr[])
//这里是用循环的方法进行实现的,而题目里面用递归来实现
{
    
    
	int left = 0;
		int right = my_strlen(arr)-1;
	while (left < right)
	{
    
    
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}
void reverse_string(char* arr)//通过递归来实现逆序
{
    
    
	char tmp = arr[0];
	int len = my_strlen(arr);
	arr[0] = arr[len - 1];
	arr[len - 1] = '\0';
	if (my_strlen(arr + 1) >= 2)
		reverse_string(arr + 1);
	arr[len - 1] = tmp;
}
int main()
{
    
    
	char arr[] = "qqqsssabcdef";
	reverse_string(arr);
	printf("%s\n", arr);
	return 0;
}

题目名称:写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

输入1729,输出19

int DigitSum(unsigned int num)
{
    
    
	if (num > 9)
	{
    
    
		return DigitSum(num / 10) + (num % 10);
	}
	else
	{
    
    
		return num;
	}
}
int main()
{
    
    
	unsigned int num = 0;
	scanf("%d", &num);
	int ret = DigitSum(num);
	printf("ret = %d\n", ret);
	return 0;
}

题目名称:递归实现n的k次方

编写一个函数实现n的k次方,使用递归实现

double Pow(int n, int k)
{
    
    
	//n^k = n* n^(k-1)
	if (k < 0)
		return (1.0 / (pow(n, -k)));
	else if (k == 0)
		return 1;
	else
		return n*Pow(n, k - 1);
	   // 2的3次方  意思就是 2*pow(2^3-1)
}
int main()
{
    
    
	int n = 0;
	int k = 0;
	printf("请输入n和k,n和k之间用空格隔开\n");
	scanf("%d%d", &n, &k);

	double ret = Pow(n,k);
	printf("ret = %lf\n", ret);
	return 0;
}

题目名称计算 斐波那契数列

题目内容
递归和非递归分别实现求第n个斐波那契数
例如:
输入:5 输出:5
输入:10 输出:55
输入:2 输出:1

int Fib(int n)
{
    
    
	int a = 1;
	int b = 1;
	int c = 1;
	while (n > 2)
	{
    
    
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
    
    
	int n = 0;
	int ret = 0;
	scanf("%d", &n);
	ret = Fib(n);
	printf("ret=%d'n", ret);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_52495715/article/details/120532223