习题1 斐波那契数列的最小步数
Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。
输入描述:
输入为一个正整数N(1 ≤ N ≤ 1,000,000)
输出描述:
输出一个最小的步数变为Fibonacci数"
(求一个数跟斐波那契数列中元素的最小步数)
#include<stdio.h> #include<stdlib.h> int main() { int a=0; int b=1; int c=a+b; int n; scanf("%d",&n); while(1) { if(a==n||b==n) { printf("%d",0); break; } else { if(n>a&&n<b) { if(abs(n-a)>abs(b-n)) printf("%d",abs(n-b)); else printf("%d",abs(n-a)); break; } } a=b; b=c; c=a+b; } return 0; }
abs函数
头文件#include<stdlib.h>
int abs(int x)
x -- 完整的值
返回值:该函数返回 x 的绝对值
习题2 空格替换
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
class Solution { public: void replaceSpace(char *str,int length) { int i=0; int count=0; while(str[i]!='\0') { if(str[i]==' ') { count++; } i++; } i=length-1; int j=length-1+count*2; for(i=length-1,j=length-1+count*2;i>0,j>0;i--,j--) { if(str[i]!=' ') str[j]=str[i]; else { str[j--]='0'; str[j--]='2'; str[j]='%'; } } } };
解题思路:先计算出空格数,每个空格处之后会被修改为3个字符,也就是说在每个空格处会增加俩个字符,给空格数*2,然后把这个长度加到数组后面(把数组延长一下),然后从前往后开始遍历,遇到空格之后则按要求转换
选择题
第一题 unsigned char取值范围考察
#include<stdio.h> int main(){ unsigned char i = 7; int j = 0; for(;i > 0;i -= 3){ ++j; }p rintf("%d\n", j); return 0; }
请问该程序的输出是多少()
A 2
B 死循环
C 173
D 172
题解:unsigned char取值范围0-255
i变化范围:7,4,1,254-2(中间j加了84次,2的时候j再加一次即85次),255-0(中间j加了85次)
第二题 位运算
以下哪个选项一定可以将flag的第二个bit置0()
A.flag&=~2
B.flag|=2
C.flag^=2
D.flag>>=2
A 2的二进制0010
取非之后 1100
此时第二个bit位为0,与任何数相与结果都是0
以下哪个选项一定可以将flag的第二个bit置0()
int fun(int a){ a^=(1<<5)-1; return a; }
F(21)的结果
A.10
B.5
C.3
D.8
A,1的二进制位000001
左移五位 100000
减1 011111
和21异或 010101
001010
结果为10
第三题 大小写转换
#
include <stdio.h> int main() { char a = 0, ch; while ((ch = getchar()) != '\n') { if (a % 2 != 0 && (ch >= 'a' && ch <= 'z')) ch = ch - 'a' + 'A'; a++; putchar(ch); }p rintf("\n"); return 0; }
以下程序运行时,若输入1abcedf2df<回车>输出结果是()
A.1abcedf2df
B.1ABCEDF2DF
C.1AbCeDf2dF
D.1abceDF2DF
C,该题将小写字符转换为大写字母,且该字母ASCII码值不能是2的整数倍
第四题 结构体内存对齐
struct One{ double d; char c; int i; } struct Two{ char c; double d; int i; }
下面两个结构体
在#pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是()
A.16 24,16 24
B.16 20,16 20
C.16 16,16 24
D.16 16,24 24
A
第五题 循环
int x = 1; do{ printf("%2d\n",x++); }while(x--);
A.1
B.无任何输出
C.2
D.陷入死循环
D
第六题 运算
#include<stdio.h> #include<stdlib.h> void main() { int a = -3; unsigned int b = 2; long c = a + b; printf("%ld\n", c); }
A.-1
B.4294967295
C.0x7FFFFFFF
D.0xFFFFFFFF
A
第七题 指针运算
设有定义char *p[]={"Shanghai","Beijing","Honkong"};则结果为j字符的表达式是
A.*p[1] +3
B.*(p[1] +3)
C.*(p[3] +1)
D.p[3] [1]
B
下面关于"指针"的描述不正确的是()
A.当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B.32位系统下任何类型指针的长度都是4个字节
C.指针的数据类型声明的是指针实际指向内容的数据类型
D.野指针是指向未分配或者已经释放的内存地址
A
第八题 函数递归
int f(int x){ return ((x>2) ? x*f(x-1) : 3); } int i; i=f(f(2));
执行如上函数后. i的值为()
A.30
B.无限递归
C.9
D.2160
C
第九题 二维数组
int p[][4] = {{1}, {3, 2}, {4, 5, 6}, {0}};
中,p[1][2]的值是()
A.1
B.0
C.6
D.2
B
第十题 宏定义
下列关于C/C++的宏定义,不正确的是()
A.宏定义不检查参数正确性,会有安全隐患
B.宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用const常量
C.宏的嵌套定义过多会影响程序的可读性,而且很容易出错
D.相对于函数调用,宏定义可以提高程序的运行效率
设有以下宏定义:
#define N 3+1 #define Y(n) ((N+1)*n)
则执行语句 z=2*(N+Y(5+1))后,z 的值为()
A.60
B.190
C.248
D.上述答案都不对
A
第十一题 程序编译
由多个源文件组成的C程序,经过编辑、预处理、编译、链接等阶段会生成最终的可执行程序。下面哪个阶段可以发现被调用的函数未定义()
A.预处理
B.编译
C.链接
D.执行
C
第十二题 隐式转换
char a; int b; float c; double d;
则表达式 a*b+d-c 值的类型为()
A.float
B.int
C.char
D.double
D