C语言练习题(13)如果 x=2014 ,下面函数的返回值是( )A: 20 B: 21 C: 23 D 25(非常详细的讲解)

文章探讨了C语言中的函数实现、二进制计算、指针操作(包括指针定义、运算和空指针)、数组表达式、运算符使用,以及递归和斐波那契数列的计算,还包括内存管理中的malloc和输入/输出控制。最后涉及一个模拟兔子繁殖问题的编程示例。
摘要由CSDN通过智能技术生成

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()函数输出计算得到的部分数列的和,保留两位小数。

⑤整个过程会一直重复,直到接收到的输入中没有更多的整数对为止(即输入结束)。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chris·Bosh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值