2022.01.04练习

1.结构体使用

传结构体时,为避免结构体过大导致性能下降而使用传址,记得用结构体类型指针接收。

typedef struct inf
{
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}inf;
print(inf* ps)
{
	printf("name:%s\n", ps->name);
	printf("age:%d\n", ps->age);
	printf("tele:%s\n", ps->tele);
	printf("sex:%s\n", ps->sex);
}
int main()
{
	inf zs = { "张三",40,"18686868686","男" };
	print(&zs);
	return 0;
}

2.喝汽水,1元1瓶,2个空瓶换1瓶,问20元能喝几瓶?

int main()
{
	int money = 0;
	int empty = 0;
	int num = 0;
	scanf("%d", &money);
	num = money;
	empty = money;
	while (empty >= 2)
	{
		num += empty / 2;
		empty = empty / 2 + empty % 2;
	}
	printf("总共喝了%d瓶\n", num);
	return 0;
}

3.逆序字符串

#include<stdio.h>
#include<assert.h>
#include<string.h>
void reverse(char* pa)
{
	assert(pa);
	int len = strlen(pa);
	char* left = pa;
	char* right = pa + len - 1;
	char tmp = 0;
	while (left < right)
	{
		tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abc defg";
	reverse(arr);
	printf("%s\n", arr);
	return 0;
}

4.求一个整数存储在内存中的二进制中的1的个数

        第一种方法,按位与一次右移一次,按位与结果为真便计数,右移至输入值为零时退出循环。要适用于负数,所以i的类型要求unsigned int。

int main()
{
	unsigned int num = 0;
	int count = 0;
	scanf("%d", &num);
	while (num)
	{
		if (num & 1)
			count++;
		num = num >> 1;
	}
	printf("%d\n", count);
	return 0;
}

        循环处也可以改为如下.

	for (i = 0; i < 32; i++)
	{
		if ((num >> i) & 1)
			count++;
	}

        第二种方法,首先加加,然后自己与自己减一按位与。突然看到有点难理解,但是多计算几次会发现,每一次按位与会让输入值的二进制中1的个数减1,所以要先加加。

	while (num)
	{
		count++;
		num = num & (num - 1);
	}

        第三种方法,模2除2。这种方法不能处理负数,局限性较大。应采用前两种,这里提供一个思路。在十进制中,%10得到最后一位,/10去掉最后一位,同样在二进制中,模2得到最后一位,即1或0,为真则计数,除2去掉最后一位,循环至输入值为0.

	while (num)
	{
		if (num % 2)
			count++;
		num = num / 2;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值