每日一练8.27

1、打印一个整型数的二进制。

void printf_bin(int n)
{
int i, len = sizeof(n) * 8; //len 表示 n 的位数,其值与编译机器有关
for(i = len-1; i >= 0; i--) {
if(n & (1 << i))
printf("1");
else
printf("0");
}
printf("\n");
return;
}

2、下面程序的输出结果是多少?

int main(int argc, const char *argv[])
{
char *str[3] = {"stra", "strb", "strc"}; //数组 str 存放 3 个字符串首地址
char *p = str[0]; //注意 p 指向字符串"stra"
int i = 0;
for(i = 0; i < 3; i++)
printf("%s\n"; p+i); //依次打印 stra tra ra
for(i = 0; i < 3; i++)
printf("%s\n", *(str+i)); //依次打印 stra strb strc
return 0;
}

答案:stra\n tra\n ra\n stra\n strb\n str

3、判断一个 int 是否为 2 的 n 次方,给出最简洁的判断方

bool judge(int num)
{
if(num & (num-1))//注意这里的逻辑对应
return false;
else
return true;
}

4、什么是柔性数组?并用 C 代码定义一个柔性数组

/*
*本程序是为了验证柔性数组的
*不定长数组常用于网络通信中不定长的数据包
*/
#include <stdio.h>
#include <stdlib.h>
struct Arr{
	int num; //num 并没有实际意义,我们可以赋予它计数/长度的意义
	int arr[0]; //可理解为 const int *arr,不同标准/平台可能解释结果不同
};
int main(int argc, const char *argv[])
{
	struct Arr test;
//大小应该是 4,int[0]在有些编译器被解释为 int *,而有些编译器则直接忽略
	printf("sizeof(test):%d\n", sizeof(test));
	struct Arr *ptr = malloc(sizeof(struct Arr)+16);
	printf("%d\n", ptr->arr[3]);
	printf("%d\n", ptr->arr[4]);//合法的,虽然容易越界,但是数组本身有越界的可能
	return 0;
}

5、编程题(某公司笔试题目)
背景:某楼盘开发商比较迷信,住宅大楼建好后将所有带有 4 的楼层编号剔除掉了,也就是
现在的楼层序号为:1、2、3、5、6、7、8、9、10、11、12、13、15……
1)该楼盘共有 n 层(实际楼层),那么对应的楼层编号最大为多少?编程验证
2)某业主回家需要坐电梯到编号为 m 的楼层,问该业主实际住几楼?编程计算

int maxFloor(int real)
{
	if(real < 1 || real > 300) {
	printf("%d is out of range!", real);
	return 0;
	}
	int i = 1, num = 1;
	while(I < real) {
		if(num%10==4 || num%100/10==4) {
			num++; //编号++
		} else {
			i++; //下一层
			num++; //第 i 层编号为 num
	}
	}
return num;
}
int realFloor(int num)
{
	if(num%10==4 || num%100/10==4) {
		printf("%d is illegal!\n", num);
		return 0;
	}
	if(num < 1 || num > 399) {
		printf("%d is out of range!", num);
		return 0;
	}
	int i = 1, real = num;
	while(i < num) {
		if(i%10==4 || i%100/10==4) {
			real- -; //编号++
			i++;
		} else {
			i++; //下一层
		}
	}
	return num
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值