目录
一.选择题
1、以下程序段的输出结果是( )
2、若有以下程序,则运行后的输出结果是( )
3、如下函数的 f(1) 的值为( )
4、下面3段程序代码的效果一样吗( )
5、对于下面的说法,正确的是( )
二,编程题
1.尼科彻斯定理
2.等差数列
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}
A: 12 B:13 C: 16 D: 以上都不对
解析:
考察的是转义字符
\\ 表示字符'\',\123表示字符'{',\t表示制表符;
转义字符通常考察两种:
①\ddd ddd表示1~3个八进制
②\xhh hh表示1~2个十六进制
正确答案:A
#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
解析:
考察的是define宏定义
宏只是替换,替换后NUM的样子是(2+1+1)*2+1/2,计算得8 ;
#define是宏定义,只进行替换
正确答案:B
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
解析:
考察的是函数递归static修饰的局部变量——称为静态局部变量
static实际修改了局部变量的存储类型,将原本应该存储在栈区的局部变量存储在静态区。静态区上数据存储的特点是,程序结束变量才被释放。我们常见的全局变量就是存储在静态区上。现在我们分析static修饰后作用域和生命周期的变化:
【作用域】:作用域不变,只是出作用域不被销毁
【生命周期】:生命周期变长,程序结束生命周期才结束正确答案:C
int b;
①const int* a = &b;
②int const* a = &b;
③int* const a = &b;
A: (2)=(3) B: (1)=(2) C: 都不一样 D: 都一样
解析:
考察的是const;
将变量转成常量
但并不是真正的变成常量,只是语法形式变成常量;本质上还是变量,
counst 修饰的变量不能再被改变;
修饰指针有两种方法
counst int* p ;
int * counst p;
- const 放在的左边
限制的指针指向的内容,也就是说: 不能通过指针来修改指针指向的内容
但是指针变量是可以修改的,也就是指针指向其他变量的
- const 放在的右边
限制的是指针变量本身,指针变量不能再指向其他对象
但是可以通过指针变量来修改指向的内容
正确答案:B
A: 对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof(c)
B: 对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零
C: 初始化方式 char a[14] = "Hello, world!"; 和char a[14]; a = "Hello, world!";的效果相同
D: 以上说法都不对
解析:
考察的是结构体和sizeof;
A.没有考虑内存对齐
B.考察浮点型的比较,由于浮点型存在误差,不能直接判断两个数是否相等,通常采用比较两个数差的绝对值是否小于一个很小的数,作为误差
C.第二种的a代表首元素的地址,地址是常量不可以改变
正确答案:D
验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。
例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出。
数据范围:1≤m≤100
尼科彻斯定理——牛客网
#include
int main()
{
int m = 0;
scanf("%d", &m);
//获得m的三次幂的数
int ret = pow(m, 3);
printf("m的立方数:%d\n", ret);
//如果m是1
if (m == 1)
{
printf("%d", m);
}
//找到首个元素
int num = m * m - m + 1;
//进行循环找到后面m个数字
for (int i = 0; i < m; i++)
{
//打印首个数字
if (i == 0)
{
printf("%d ", num);
}
//打印后面的
else {
printf("+ %d ", num);
}
num += 2;
}
return 0;
}
通过示例发现,我们只要找到相加数字串的首个数字就可以通过+2的方式找到后面m-1个;
4^3=13+15+17+19;
首数字13是4*4-4+1得到的数字,然后就是通过循环找到后面几个数字;
等差数列 2,5,8,11,14。。。。
(从 2 开始的 3 为公差的等差数列)
输出求等差数列前n项和
数据范围:1≤n≤1000
输入描述:
输入一个正整数n。
输出描述:
输出一个相加后的整数。
等差数列———牛客网
int main()
{
int n = 0;
int arr[1000];
scanf("%d", &n);
//将等差数列存入数组
for (int i = 0; i < 1000; i++)
{
arr[i] = 3 * (i + 1) - 1;
}
//将等差数累加
int sum = 0;
for (int j = 0; j < n; j++)
{
sum = sum + arr[j];
}
printf("%d", sum);
return 0;
}