C语言日常刷题 2

文章目录

  • 题目
  • 答案与解析
    • 1、
    • 2、
    • 3、
    • 4、
    • 5、
    • 6、
    • 7、


题目

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

#include
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}

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

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

#include 
#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) 的值为( )

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段程序代码的效果一样吗( )

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表示制表符,这些都是一个字符

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、

解法一:

//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:

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:

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:

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;
}

你可能感兴趣的:(c语言,算法,开发语言)