【暑期每日一练】 day13

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 【暑期每日一练】 day13

选择题

(1)

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

解析:

这个作用是对整型中0的个数进行统计,x=x|(x+1);的作用是每次循环把x的二进制中从右往左数的最后一位0变成1,直道变成全1的时候x+1就溢出为全0,循环结束。2014的二进制是0000 0000 000 0000 0000 0111 1101 1110,所以结果是23

 

(2)

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

解析:

A选项的x是指针,赋值时使用a不合适,C选项在赋值时a变量还没定义,D选项中的x不是指针。

 

(3)

3、下面有关空指针和未初始化指针,说法错误的是( )

A: 对0x0这个地址取值是非法的

B: 空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方

C: 空指针与任何对象或函数的指针值都不相等

D: malloc在其内存分配失败时返回的是一个未初始化的指针

答案:D

解析:

malloc函数在内存分配失败时返回NULL,其余选项都正确

 

(4)

4、若有定义 int a[8]; ,则以下表达式中不能代表数组元素 a[1] 的地址的是( )

A: &a[0]+1 B: &a[1] C: &a[0]++ D: a+1

答案:C

解析:

D选项a计算时是首元素地址,再加1,就是a[1]的地址,AB明显对,C选项a[0]先和++结合,形成一个表达式,不能对表达式取地址,会报错

 

(5)

5、以下选项中,对基本类型相同的两个指针变量不能进行运算的运算符是( )

A: + B: - C: = D: ==

答案:A

解析:

A错误,因为两个地址相加无意义也可能越界,所以规定不允许指针相加。B选项,可以求出两个数据元素储存位置之间的相隔同数据类型的元素个数,C选项,赋值,没问题,D选项,判断两指针是否相同

 

编程题

题一

描述

有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。

例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。

一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?

数据范围:输入满足  1≤n≤31

输入描述:

输入一个int型整数表示第n个月

输出描述:

输出对应的兔子总数

示例

解析:

这道题的关键在于寻找数字之间的规律,如果细心的同学会发现这其实是一个斐波那契数列。第 n 个月的兔子数量实际上就是第 n-1 个斐波那契数。

代码实现

#include <stdio.h>
int main()
{
    int n;
    while(~scanf("%d", &n)) 
    {
        int num1 = 1, num2 = 1, ret = 0;
        for (int i = 2; i < n; i++) 
        {
            ret = num1 + num2;
            num1 = num2;
            num2 = ret;
        }
        printf("%d\n", ret);
    } 
    return 0;
}

题二

描述

数列的定义如下:数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。

输入描述:

输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。

输出描述:

对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。

示例:

解析:

求取一个数字的平方根可以使用数学库中的 double sqrt(double num) 函数完成,接下来只需要从数字自身开始进行求和并在求和后将 n 自身计算成为自身的平方根即可。

代码实现

#include <stdio.h>
#include <math.h>
int main()
{
    double m, n;
    while(~scanf("%lf %lf", &n, &m)) 
    {
        double sum=0;
        while(m-- > 0) 
        {
            sum += n;//从自身开始以及每次的平方根进行求和
            n = sqrt(n);//n成为当前自身的平方根
        }
    printf("%.2lf\n", sum);
    } 
    return 0;
}

总结

关于今日练习讲解到这儿,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。

相关文章
|
存储 大数据 Serverless
【暑期每日一练】 day7
【暑期每日一练】 day7
|
存储 人工智能 C语言
【暑期每日一练】 day9
【暑期每日一练】 day9
|
编译器 C语言
【暑期每日一练】 day12
【暑期每日一练】 day12
|
Serverless C语言
【暑期每日一练】 day8
【暑期每日一练】 day8
|
存储 人工智能 安全
【暑期每日一练】 day15
【暑期每日一练】 day15
|
存储 测试技术 C语言
【暑期每日一练】 Epilogue
【暑期每日一练】 Epilogue
|
C语言
【暑期每日一练】 day11
【暑期每日一练】 day11
|
C语言
【暑期每日一练】 day6
【暑期每日一练】 day6