考研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;
}
相关推荐
nnerddboy15 分钟前
Rust教程05:结构体,枚举与模式匹配
开发语言·网络·rust
小小尚@19 分钟前
AE脚本-AE Actions v1.1.8 操作动作记录器
开发语言·前端·javascript·jupyter·postman
程序员雷欧41 分钟前
Java 反射深度解析:从原理到源码的全面剖析
java·开发语言·python
登登登__1 小时前
春秋招笔试题总结
java·开发语言
我的xiaodoujiao1 小时前
快速学习Python基础知识详细图文教程18--多线程
开发语言·python·学习·测试工具
SNAKEpc121381 小时前
OpenGL(十五)- 着色器语言GLSL
c语言·c++·线性代数·算法·矩阵·图形渲染·着色器
想要入门的程序猿1 小时前
Qt插件QPluginLoader
开发语言·qt
Rabitebla2 小时前
C++11 新特性详解(一):列表初始化、initializer_list 与右值引用
java·开发语言·数据结构·c++·算法·leetcode·list
洋不写bug2 小时前
JavaComparable、Comparator、Cloneable接口解析,深拷贝浅拷贝详细解析
android·java·开发语言
吴声子夜歌2 小时前
正则指引——Golang
开发语言·golang·正则表达式