栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言相关习题(移位操作、递归)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言相关习题(移位操作、递归)

目录

1. 统计二进制数中1的个数

2. 比较两个二进制数中,不同位的个数

3. 交换两个变量,不创建临时变量

4. 递归实现字符串逆序

5. 递归计算一个非负整数的数字之和;例如:123 输出6

6. 递归实现n的k次方(正数)


1. 统计二进制数中1的个数
int Count_bit1(int a)//统计二进制位中1的个数
{
	int count = 0;
	//类比十进制中,获得每一位,123,123%10=3,123/10=12,12%10=2
	while(a != 0)
	{
		if(a % 2 == 1)
			count++;
		a = a/2;
 	}
	return count;
}
int Count_bit2(int a)//统计二进制位中1的个数
{
	int count = 0;
	int i = 0;
	for(i = 0; i<32; i++)
	{
		//a = a >> i;
		if(((a>>i) & 1) == 1)//移位操作本身不会改变变量的值
			count++;
	}
	return count;
}
int Count_bit3(int a)//统计二进制位中1的个数
{
	int count = 0;
	while(a)
	{
		a = a & (a-1);//a & (a-1) 每一次相邻两位数按位与都会减少一个二进制的1
		count++;
	}
	return count;
}
int main(){
	int a = -1;
	int count1 = Count_bit1(a);//该函数对负数不适用
	int count2 = Count_bit2(a);//通过位操作符来计算
	int count3 = Count_bit3(a);//最精简的一种写法
	printf("%dn", count1);
	printf("%dn", count2);
	printf("%dn", count3);
}

2. 比较两个二进制数中,不同位的个数
int Compare_bit1(int a, int b)
{
	int count = 0;
	int i = 0;
	for(i=0; i<32; i++)
	{
		if(((a>>i)&1) != ((b>>i)&1))
			count++;
	}
	return count; 
}
int Compare_bit2(int a, int b)
{
	int tmp = a^b;//直接用异或,相同位为0,不同位为1;
	return Count_bit1(tmp);//然后用函数统计tmp中有多少个1;
}
int main(){
	int a = 0;
	int b = 7;
	int ans1 = Compare_bit1(a, b);//每一位分别比较
	int ans2 = Compare_bit2(a, b);//用异或来统计:相同位为0,不同位为1;
	printf("%dn",ans1);
	printf("%dn",ans2);
}

3. 交换两个变量,不创建临时变量
	int a = 5; int b = 3;
	a = a+b; b = a-b; a = a-b;
	printf("%d %d",a,b);
	
	int a =5; int b = 3;
	a = a^b;//用异或的方法;
	b = a^b;
	a = a^b;
	printf("%d %d",a,b);

4. 递归实现字符串逆序
void Reverse_string2(char arr[])
{
	char tmp = arr[0];
	int sz = strlen(arr);
	arr[0] = arr[sz-1];
	arr[sz-1] = '';
	if(strlen(arr+1) >= 2)
	{
		Reverse_string2(arr+1);
	}
	arr[sz-1] = tmp;
}
int main(){
    char arr[] = "abcdef";
	int sz = strlen(arr);
	Reverse_string2(arr);//递归的方法
	printf("%sn",arr);}

5. 递归计算一个非负整数的数字之和;例如:123 输出6
int Count_sum1(int a)
{
	int sum = 0;
	while(a != 0)
	{
		sum += a%10;
		a /= 10;
	}
	return sum;
}

int Count_sum2(int a)
{
	if (a < 10)
		return a;
	else
		return Count_sum2(a/10) + a%10;
}

int main(){
	int a = 123;
	//int sum = Count_sum1(a);//循环的方法
	int sum = Count_sum2(a);//递归的方法
	printf("%dn",sum);
}

6. 递归实现n的k次方(正数)
int Pow(int n, int k)
{
	if(k>=1)
		return Pow(n,k-1) * n;
	else
		return 1;
} 
int main(){
	int n = 5;
	int k = 2;
	int ret = Pow(n,k);
	printf("%dn", ret); }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990387.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号