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
}