1:如果 x=2014 ,下面函数的返回值是( )
int fun(unsigned int x)
{
int n = 0;
while(x + 1)
{
n++;
x = x | (x + 1);
}
return n;
}
A: 20 B: 21 C: 23 D 25
解析 C
2014对应的二进制为:00000000 0000000 00000111 11011110
2015对应的二进制为:00000000 0000000 00000111 11011111
2014|2015为: 00000000 0000000 00000111 11011111 此二进制为2015
2016对应的二进制为:00000000 0000000 00000111 11100000
2015|2016为: 00000000 0000000 00000111 11111111 此二进制为2047
2048对应的二进制为:00000000 0000000 00001000 00000000
2047|2048为: 00000000 0000000 00001111 11111111 此二进制为4095
4096对应的二进制为:00000000 0000000 00010000 00000000
4095|4096为: 00000000 0000000 00011111 11111111通过观察可知,每循环一次0的数量减一 ,直到溢出 所以2014二进制中一共有23个0则返回值为23
2:下列语句定义 x 为指向 int 类型变量 a 的指针,其中哪一个是正确的( )
A: int a , *x = a; B: int a , *x = &a; C: int *x = &a , a; D: int a , x = a;
解析 B
int 变量名,指针变量名=&变量名;
int a,x=&a;中a这个变量名必须在指针变量之前,且由于优先级与=的级别最低且由由向左 所以理解为(指针变量名=&变量名)
3:下面有关空指针和未初始化指针,说法错误的是( )
A: 对0x0这个地址取值是非法的
B: 空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方
C: 空指针与任何对象或函数的指针值都不相等
D: malloc在其内存分配失败时返回的是一个未初始化的指针
解析 D
malloc申请内存空间失败的时候,人家返回的值为NULL,而不是任意的。
有关malloc和calloc函数的详细解释,可以看我之前写的博客哦。另外,空指针与野指针的区别,空指针也就是通常指向为NULL的指针,野指针就是指向一块未知的内存区域,也有可能定义了一个指针没有初始化,由于内存空间中的值在未赋值之前是随机数,所以也有可能诞生野指针。
4:若有定义 int a[8]; ,则以下表达式中不能代表数组元素 a[1] 的地址的是( )
A: &a[0]+1 B: &a[1] C: &a[0]++ D: a+1
解析 C
&a[0]++;是错误语句,编译都不会过。因为++是后++,在执行该语句时是不计算的,所以a[0]++是个表达式而不是值,显然用&取一个表达式的地址是非法操作!
如果是&++a[0];则是正确的,因为前++在执行&时已经计算过了:就是先给a[0]+1,然后再取a[0]的地址。
5:以下选项中,对基本类型相同的两个指针变量不能进行运算的运算符是( )
A: + B: - C: = D: ==
解析 A
因为两个地址相加无意义也可能越界,所以规定不允许指针相加。
6:有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
数据范围:输入满足 :1≤n≤31
输入描述:输入一个int型整数表示第n个月
输出描述:输出对应的兔子总数
示例1
输入:3
输出:2
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void caculate(int month)
{
if (month < 3)
printf("1");
int start_rabbit, birth_first_rabbit, all_rabbit;
start_rabbit = birth_first_rabbit = 1;
for (int i = 3; i < month + 1; i++)//从第三个月开始
{
all_rabbit = start_rabbit + birth_first_rabbit;
start_rabbit = birth_first_rabbit;
birth_first_rabbit = all_rabbit;
}
printf("%d",all_rabbit);
}
int main()
{
int month;
scanf("%d", &month);
caculate(month);
return 0;
}
解析1
①首先,程序通过scanf函数从用户输入中获取一个整数值,表示要计算兔子数量的月份。
②然后,程序定义了一个calculate函数,它接受一个整数参数month,表示要计算的月份。
③函数内部首先判断month是否小于3,如果是则直接输出数字1,因为在前两个月兔子的数量都是1。
④接下来,函数定义了三个整数变量start_rabbit、birth_first_rabbit和all_rabbit,它们的初始值都为1。
⑤然后,使用一个循环,从第三个月开始逐个计算每个月的兔子数量。循环中,首先将上个月的兔子数量和前两个月的兔子数量相加,得到当前月的兔子数量all_rabbit。然后,将start_rabbit的值更新为上个月的兔子数量,将birth_first_rabbit的值更新为前两个月的兔子数量,以备下一次循环使用。
⑥最后,输出最终计算得到的兔子数量all_rabbit。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int fib(int n)
{
if (n < 3)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
int main()
{
int n;
scanf("%d", &n);
printf("%d", fib(n));
return 0;
}
解析2
这个方法或许没有那么直观,我们尝试算几组数据,第一个月1只,第二个月1只,第三个月2只,第四个月3只,第五个月5只,第六个月8只,这显然是一个斐波那契数列。
这个程序实现了一个计算斐波那契数列的函数fib()和一个主函数main()。
函数fib()用递归的方式计算斐波那契数列的第n个数字。当n小于3时,返回1,否则递归地调用fib()函数计算n-1和n-2的斐波那契数列数字,并将它们相加返回。
主函数main()首先从用户输入中读取一个整数n,然后调用fib()函数计算斐波那契数列的第n个数字,并将结果打印出来。
7:数列的定义如下:数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
输入描述:输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。
输出描述:对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
示例1
输入: 输出:
81 4 ……94.73
2 2 ……3.41
#include <stdio.h>
#include <math.h>
int main()
{
int n;
int m;
while(scanf("%d %d",&n,&m)!=EOF)
{
double sum=0;
double first_number=n;
for (int i=0;i<m;i++)
{
sum=sum+first_number;
first_number=sqrt(first_number);
}
printf("%.2lf\n",sum);
}
return 0;
}
解析
sqrt是求平方根的函数,其头文件为<math,h>
①这段C代码实现了一个循环,接受输入的两个整数n和m,在每次循环中计算一个部分数列的和并输出。
②在每次循环中,首先定义一个变量sum来保存部分数列的和,初始化为0。然后定义一个变量first_number来保存每个数列的第一个数,初始化为n。
③接下来,通过一个for循环,循环m次来计算部分数列的和。在每次循环中,先将first_number加到sum中,然后通过sqrt()函数计算first_number的平方根,并将结果赋给first_number。
④ 循环结束后,使用printf()函数输出计算得到的部分数列的和,保留两位小数。
⑤整个过程会一直重复,直到接收到的输入中没有更多的整数对为止(即输入结束)。