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