考研C语言操作数以及函数刷题基础刷题

目录

[第一题 两数交换不用第三个参数(面试题)](#第一题 两数交换不用第三个参数(面试题))

方法一:使用算数方法

方法二:异或

[第二题:将0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010](#第二题:将0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010)

[第三题 判断闰年](#第三题 判断闰年)

第四题:最大公约数

第五题:输出100-200之间的素数

第六题:乘法口诀表

[第七题: 完成对数组的操作](#第七题: 完成对数组的操作)

第八题:冒泡排序

第九题:统计二进制中1的个数

方法一:%与/方法

[注意 :负数的情况](#注意 :负数的情况)

[方法二: 移位运算和位运算,循环32位](#方法二: 移位运算和位运算,循环32位)

[方法三: 只循环1的个数的次数(难)](#方法三: 只循环1的个数的次数(难))

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

[第十一题 :比较二进制位数不同个数](#第十一题 :比较二进制位数不同个数)


第一题 两数交换不用第三个参数(面试题)

不用引用第三个参数,实现两个数交换。

方法一:使用算数方法

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>

//不用第三个参数实现两个数交换

//方法一:算数方法

int main()
{
	int a = 5;
	int b = 3;
	
	a = a + b;
	b = a-b;
	a = a-b;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
	
}

方法二:异或

^异或操作符的意思是,相同为0,相异为1;所以可以实现交换。

a = a ^ b; //0011^0101=0110=6

b = a ^ b; //0110^0101=0011=3

a = a ^ b; //0110^0011=0101=5

cpp 复制代码
//方法二:逻辑异或
int main()
{
	int a = 3;
	int b = 5;
	a = a ^ b;	//0011^0101=0110=6
	b = a ^ b;	//0110^0101=0011=3
	a = a ^ b;	//0110^0011=0101=5
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
	

第二题:将0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010

将0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010

cpp 复制代码
//将10:0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010
int main()
{
	int a = 10;
	//10 = 0000 0000 0000 0000 0000 0000 1010
	//或上 0000 0000 0000 0000 0000 0001 0000
	//0000 0000 0000 0000 0000 0001 0000 由0000 0000 0000 0000 0000 0000 0001左移四位获得
	a |= (1 << 4);
	printf("%d\n", a);
	return 0;
}

将26:0000 0000 0000 0000 0000 0001 1010 改为 0000 0000 0000 0000 0000 0000 1010

cpp 复制代码
//将26:0000 0000 0000 0000 0000 0001 1010 改为 0000 0000 0000 0000 0000 0000 1010

int main()
{
	int a = 26;
	//26 = 0000 0000 0000 0000 0000 0001 1010 
	//与上 1111 1111 1111 1111 1111 1110 1111
	//1111 1111 1111 1111 1111 1110 1111由1111 1111 1111 1111 1111 1111 1111 1110向左移动4位
	//1111 1111 1111 1111 1111 1111 1111 1110可由 0000 0000 0000 0000 0000 0001取反获得
	a &= ~(1 << 4);
	printf("%d\n", a);
	return 0;
}

第三题 判断闰年

闰年:

  1. 能被4整除,但不能被100整除

2.或者能被400整除的年叫闰年

  1. 闰年必须是400的倍数,否则为平年
cpp 复制代码
//打印打印1000年到2000年之间的闰年

int main()
{
	int i = 1000;
	for (i = 1000; i <= 2000; i++)
	{
		if(i%4==0&&i%100!=0||i%400==0)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

判断是不是闰年

cpp 复制代码
int main()
{
	/*int i = 1000;
	for (i = 1000; i <= 2000; i++)
	{
		if(i%4==0&&i%100!=0||i%400==0)
		{
			printf("%d ", i);
		}
	}*/
	int i = 0;
	scanf("%d", &i);
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
		{
			printf("是闰年\n");
		}
		else
		{
			printf("不是闰年\n");
		}
	
	return 0;
}

第四题:最大公约数

注意:

  1. 两个scanf后面不要加空格或\n要不然编译器不知道什么时候为输入完。

  2. 两个for循环是可以合并成一个的。

cpp 复制代码
//最大公约数

int main()
{
	int n = 0;
	int m = 0;
	scanf("%d", &n);
	scanf("%d", &m);
	int i = 0;
	int sum = 0;
	for(i=1;i<n&&i<m;i++)
	{
		if(n%i==0&&m%i==0)
		{
			sum = i;
		}
	}
	printf("最大公约数为%d\n", i);
	return 0;
}

第五题:输出100-200之间的素数

注意:

1.先遍历100-200

2.在遍历2------(n-1)

3.如果2------(n-1)之间存在不是素数的就break;

4.如果循环到最后,如果i=n-1,那么就是素数。

cpp 复制代码
//打印100-200素数

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

第六题:乘法口诀表

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

如:输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表。

cpp 复制代码
//在屏幕上输出9*9乘法口诀表
void mul(int n)
{
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= i; j++)
		{
			printf("%d*%d=%d ", j, i, j * i);
		}
		printf("\n");
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	mul(n);
	return 0;
}

第七题: 完成对数组的操作

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

  1. 实现函数init() 初始化数组为全0
  2. 实现print() 打印数组的每个元素
  3. 实现reverse() 函数完成数组元素的逆置。

**要求:**自己设计以上函数的参数,返回值。

cpp 复制代码
//初始化为0
void init(int arr[], int n)
{
	for(int n=0;n<10;n++)
	{
		arr[n] = 0;
	}
	for(int j=0;j<10;j++)
	{
		printf("%d", arr[j]);
	
	}
	printf("\n");
}
//打印数组
void print(int arr[], int n)
{
	for (int j = 0; j < 10; j++)
	{
		printf("%d", arr[j]);
	}
	printf("\n");

}
//置逆数组
void reverse(int arr[],int n)
{
	int left = 0;
	int right = n - 1;
	int sum = 0;
	while(left<right)
	{
		sum = arr[right];
		arr[right] = arr[left];
		arr[left] = sum;
		left++;
		right--;
	}
	for (int j = 0; j < 10; j++)
	{
		printf("%d", arr[j]);
	}
	printf("\n");

}
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	/*init(arr, 10);*/
	//print(arr, 10);
	reverse(arr, 10);
	return 0;
}

第八题:冒泡排序

cpp 复制代码
//冒泡排序
void bubble(int arr[], int n)
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-1-i;j++)
		{
			if(arr[j] > arr[j+1])
			{
				tmp = arr[j ];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}
		}
	}

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

第九题:统计二进制中1的个数

方法一:%与/方法

用%2,/2的方法。

例如15的二进制 0000.......0000 1111。四个1

注意 :负数的情况

如 -1:在计算机中是以补码的情况存储。

-1的补码为:1111 1111 1111 1111 1111 1111 1111 1111

-1%2=-1;-1模2余-1

-1/2=0; -1除2,不够除,所以整数为0;所以会导致i不会++。结果为0;

所以我们需要用无符号整形 unsigned int,让-1的每一位都是有效位。

cpp 复制代码
//统计二进制中1的个数

void fun(unsigned int n)
{
	int sum = 0;
	int i = 0;
	while(n)
	{
		sum = n % 2;
		n = n / 2;
		if (sum == 1)
			i++;
	}
	printf("%d", i);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	fun(n);
	return 0;
}

方法二: 移位运算和位运算,循环32位

cpp 复制代码
//方法二
void fun(int n)
{
	int count = 0;
	for(int i=0;i<32;i++)
	{
		if((n>>i)&1==1)
		{
			count++;
		}
	}
	printf("%d", count);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	fun(n);
	return 0;
}

每一位都与1做与运算,双1为1。i从0开始,到32位结束。

因为,int是4字节,字节8位。计算机中都是以补码存储。

方法三: 只循环1的个数的次数(难)

用n&(n-1),这样在二进制可以每次都减少一个1,循环了几次就有几个1。

cpp 复制代码
//方法三

void fun(int n)
{
	int i = 0;
	while(n)
	{
		n = n & (n - 1);
		i++;
	}
	printf("%d", i);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	fun(n);
	return 0;
}

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

cpp 复制代码
void fuc(int n)
{
	for(int i=30;i>=0;i -=2)
	{
		printf("%d ", (n >> i) & 1);
	}
	printf("\n");
	for(int j=31;j>=0;j-=2)
	{
		printf("%d ", (n >> j) & 1);
	}

}
int main()
{
	int n = 0;
	scanf("%d", &n);
	fuc(n);
	return 0;
}

第十一题 :比较二进制位数不同个数

编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

输入例子:

1999 2299

输出例子:7

分别将这两个数的每一位取出来比较。

cpp 复制代码
//比较二进制位数
void func(int n,int m)
{
	int count = 0;
	for(int i=0;i<32;i++)
	{
		if (((n >> i) & 1) != ((m >> i) & 1))
			count++;
	}
	printf("%d", count);
}
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	func(n, m);
	return 0;
}
相关推荐
晓蛋4 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
傲世仙尊4 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
牵猫散步的鱼儿4 天前
重载、重写(覆盖)、重定义区别
c语言
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
phltxy4 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
C语言小火车4 天前
C/C++ 为什么需要编译器?
开发语言·c++
phltxy4 天前
C 语言中的数据存储:从类型到二进制位
c语言
霍霍的袁4 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超4 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust