C语言题目强化-DAY02


★★写在前面★★
本题库源自互联网,仅作为个人学习使用,记录C语言题目练习的过程,如果对你也有帮助,那就点个赞吧。


一、选择题

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

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

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

正确答案:A

答案解析:strlen()函数计算的是从指定地址开始往后数,一直数到’\0’,返回’\0’前的字符个数,因此\123456\123456\t实际字符数应该是12个,分别为\,1,2,3,4,5,6,\123,4,5,6,\t,总共12个,\后接数字的时候,后面三个不大于8的数都会被转义,后面的数字是八进制数字,\后面接\的时候,是想输出一个\,因此也算作一个字符。

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

#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

正确答案:B

答案解析:宏只是字符串的简单替换,替换后NUM的样子是(2+1+1)*2+1/2,计算结果是8,不能脑补括号。

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

正确答案:C

答案解析:

第一次函数调用:i=1,n=1,n>=5为假,n=n+i=1+1=2,i=i+1=2;

第二次函数调用:i=2,n=2,n>=5为假,n=n+i=2+2=4,i=i+1=3;

第三次函数调用:i=3,n=4,n>=5为假,n=n+i=4+3=7,i=i+1=4;

第四次函数调用:i=4,n=6,n>=5为真,return n=7。

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

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: 都一样

正确答案:C

答案解析:

int b;
(1)const int *a = &b;//指针a存放了b的地址,*a用const修饰,*a值不可修改
(2)int const *a = &b;//指针a存放了b的地址,*a用const修饰,*a值不可修改跟(1)一样
(3)int *const a = &b;//指针a存放了b的地址,a用const修饰,a值不可修改

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

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: 以上说法都不对

正确答案:D

答案解析:

A:、对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof©,错误,没有考虑字节对齐,结构体的实际大小应该为12字节。

B、double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。

C、char a[14] = "Hello, world!"数组中存放的是 "Hello, world!"13个字符,最后一个元素为0,char a[14]; a = “Hello, world!”;,数组名a是是常量,常量不能被修改。

二、编程题

1、验证尼科彻斯定理,即:任何一个整数m 的立方都可以写成m 个连续奇数之和。例如:
输入一个正整数m(m≤100) ,将m 的立方写成m 个连续奇数之和的形式输出。
注意:本题含有多组输入数据。
输入描述:输入一个int整数
输出描述:输出分解后的string

牛客网【牛客网题号: HJ76 尼科彻斯定理】

示例:
输入:6
输出:31+33+35+37+39+41

#include<stdio.h>
#include<math.h>
int main()
{
	int m = 0;
	int j = 0;
	int i = 0;
	int ret = 0;
	scanf("%d", &m);
	for (i = 0,j = 0; i < m && j <= 2*m-2; i++,j+=2)
	{
		ret = pow((double)m, 2) - (m - 1) + j;
		printf("%d",ret );
		if(i<m-1)
			printf("+");
	}
	return 0;
}

代码思路:仔细排列可以可以发现规律:
//1 = 1
//2 = 3 + 5
//3 = 7 + 9 + 11
//4 = 13 + 15 + 17 + 19
//5 = 21 + 23 + 25 + 27 + 29
//6 = 31 + 33 + 35 + 37 + 39 + 41
首位数字的大小是m^2-1,然后往后依次递增2,递增m次。
用i来控制每一行需要递增的个数,初始化应该为0,每次递增1,最大为m时就可以递增m次了;
用j来控制每一项的值,首项为奇数,后面每一项都是奇数,所以初始化应该为0,每次j要递增2。

2、等差数列 2,5,8,11,14, … 。(从 2 开始的 3 为公差的等差数列),求等差数列前n 项和。
注意:本题有多组输入
输入描述:输入一个正整数n 。
输出描述:输出一个相加后的整数。

牛客网【牛客网题号: HJ100 等差数列】

#include<stdio.h>
int main()
{
	int n = 0;
	int last_number = 0;
	long Sn = 0;
	while (scanf("%d", &n) != EOF)
	{
		Sn = (2 + (3 * n - 1)) * n / 2;
		printf("%ld\n", Sn);
	}
	return 0;
}

代码思路:等差数列an=3(n-1)+2,前n项和为首项和尾项之和乘以项数再除以2,类似于题型上底加下底的和乘高除以2。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一直学不会编程的小徐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值