考研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;
}
相关推荐
侃侃_天下3 天前
最终的信号类
开发语言·c++·算法
echoarts3 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix3 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题3 天前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说3 天前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔3 天前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
小莞尔3 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
liujing102329293 天前
Day03_刷题niuke20250915
c语言
我是菜鸟0713号3 天前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_3 天前
QT(4)
开发语言·汇编·c++·qt·算法