C语言日常刷题 2

文章目录


题目

1、以下程序段的输出结果是( )

c 复制代码
#include<stdio.h>
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}

A: 12 B: 13 C: 16 D: 以上都不对

2、若有以下程序,则运行后的输出结果是( )

c 复制代码
#include <stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2
int main()
{
printf("%d\n", NUM);
return 0;
}

A: 4 B: 8 C: 9 D: 6

3、如下函数的 f(1) 的值为( )

c 复制代码
int f(int n)
{
static int i = 1;
if(n >= 5)
return n;
n = n + i;
i++;
return f(n);
}

A: 5 B: 6 C: 7 D: 8

4、下面3段程序代码的效果一样吗( )

c 复制代码
int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;

A: (2)=(3) B: (1)=(2) C: 都不一样 D: 都一样

5、对于下面的说法,正确的是( )

A: 对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof©

B: 对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零

C: 初始化方式 char a[14] = "Hello, world!"; 和char a[14]; a = "Hello, world!";的效果相同

D: 以上说法都不对

6、验证尼科彻斯定理,即:任何一个整数 m 的立方都可以写成 m 个连续奇数之和。例如:

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19
示例:

输入:6

输出:31+33+35+37+39+41

7、等差数列 2,5,8,11,14, ......(从 2 开始的 3 为公差的等差数列),求等差数列前 n 项和。0 =< n <=1000。

示例:

输入:2 输入:275

输出:7 输出:113575

说明:2+5=7 说明:2+5+...+821+824=113575

答案与解析

1、

正确答案:A

这里考查转义字符,注意:\ 表示字符'',\123表示字符'{',\t表示制表符,这些都是一个字符

c 复制代码
int main()
{
    char s[] = "\\123456\123456\t";
    \\ '\\' 用于表示一个反斜杠,防止它被解释为一个转义序列符。
    \\ '\ddd' ddd表示1~3个八进制的数字。 如: \130 X
    \\ '\t' 水平制表符
    printf("%d\n", strlen(s));
    return 0;
}

2、

正确答案:B

宏只是替换,替换后NUM的样子是(2+1+1)*2+1/2,计算得8

3、

正确答案:C

此题注意静态局部变量的使用,static改变了i的生命周期,第一次调用函数:i初值是1,递归第二次调用函数时,i还是第一次那个变量,值已经变成了2,再一次调用函数时i就是3,依次类推

4、

正确答案:B

const在的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在 的右边,则指针的指向不可变。简记为"左定值,右定向",(1)和(2)const都在的左边,(3)中const在的右边,所以应该选择B。

5、

正确答案:D

A选项,没有考虑内存对齐。B选项,考察double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。C选项,a为数组首地址是常量不能改变,所以A,B,C都是错的,选择D

6、

解法一:

c 复制代码
//m个连续奇数其实就是一个公差为2,共有m项的等差数列
//由等差数列前n项和公式:Sn=(n(a1+an))/2
// 第n项公式:an=a1+(n-1)d
//设m个连续奇数组成的等差数列的首项为i
//那么前m项和为:( m (i+ (i+2(m-1)) ) )/2
//即 m * i + m * (m - 1)
int main()
{
    int m = 0;
    scanf("%d", &m);
    int i = 1;//奇数开头
    int j = 0;
    int count = m * m * m;//设m的立方为count
    while (i > 0)
    {
        if (m * i + m * (m - 1) == count)//整数m的立方与m个连续奇数之和相等
        {
            for (j = 0; j < m; j++)//负责打印
            {
                if (j == m - 1)//最后一个数时不用打印 + 号
                    printf("%d", i);
                else
                {
                    printf("%d+", i);
                }
                i += 2;
            }
            break;
        }
        i += 2;//每次增加2,所得都为奇数
    }
    return 0;
}

解法2:

c 复制代码
nt main()
{
int m;
while(~scanf("%d", &m)){
int start = m * (m - 1) + 1;//找到对应m^3的起始奇数
char buf[10240] = {0};
//sprintf(buf, format, ...) 与printf用法类似,格式化字符串但是不用于打印而是放到一个buf中
sprintf(buf, "%d", start);//先将起始奇数转换成为字符串存入buf中
for (int i = 1; i < m; i++) {
//然后将紧随随后的m-1个奇数数字转换为字符串,按照指定格式放入buf中
//%s+%d, 要求先有一个字符串,然后是+符号,然后是个数字的格式,对应是buf原先的数据,和奇数
sprintf(buf, "%s+%d", buf, start+=2);
}
printf("%s\n", buf);
}
return 0;
}

7、

解法1:

c 复制代码
int main()
{
    int n = 0;
    int i = 0;
    int j = 2;
    int count = 0;
    scanf("%d", &n);
    if (n >= 1 && n <= 1000)//判段n是否在正确范围
    {
        for (i = 0; i < n; i++)//前n项
        {
            count += j;
            j += 3;//公差为3
        }
    }
    printf("%d", count);
    return 0;
}

解法2:

c 复制代码
int main()
{
	int n, a1 = 2;
	while (scanf("%d", &n)) 
	{
		int an = a1 + (n - 1) * 3;//等差数列第n项计算
		printf("%d\n", n * (a1 + an) / 2); //等差数列求和打印
	}
	return 0;
}
相关推荐
一颗花生米。2 小时前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
问道飞鱼2 小时前
Java基础-单例模式的实现
java·开发语言·单例模式
学习使我快乐012 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
通信仿真实验室2 小时前
(10)MATLAB莱斯(Rician)衰落信道仿真1
开发语言·matlab
勿语&3 小时前
Element-UI Plus 暗黑主题切换及自定义主题色
开发语言·javascript·ui
hsling松子4 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui1234 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝4 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King5 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉