0
点赞
收藏
分享

微信扫一扫

#Z0458. 树的中心2

南陵王梁枫 2024-02-06 阅读 7

目录

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

 方法一:使用算数方法

方法二:异或

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

第三题 判断闰年

 第四题:最大公约数

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

 第六题:乘法口诀表

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

第八题:冒泡排序

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

 方法一:%与/方法

注意 :负数的情况

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

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

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

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


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

 方法一:使用算数方法

#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;所以可以实现交换。

//方法二:逻辑异或
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

//将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

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;
}

第三题 判断闰年

//打印打印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;
}

判断是不是闰年

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循环是可以合并成一个的。 

//最大公约数

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之间的素数

//打印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乘法口诀表
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;
}

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

//初始化为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;
}

 

第八题:冒泡排序

 

//冒泡排序
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的个数

 方法一:%与/方法

注意 :负数的情况

如 -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的每一位都是有效位。 

//统计二进制中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位

//方法二
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的个数的次数(难)

 

//方法三

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;
}

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

 

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;
}

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

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

//比较二进制位数
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;
}

举报

相关推荐

0 条评论