笔试题一大片

下面代码结果是什么
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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值