假设输入的 x 、 y 均是不超过 15 的自然数,完成下面的判断题和单选题:
判断题
16. 删去第 7 行与第 13 行的 unsigned ,程序行为不变。( )
17. 将第 7 行与第 13 行的 short 均改为 char ,程序行为不变。( )
18. 程序总是输出一个整数“ 0 ”。( )
19. 当输入为“ 2 2 ”时,输出为“ 10 ”。( )
20. 当输入为“ 2 2 ”时,输出为“ 59 ”。( )
单选题
21. 当输入为“ 13 8 ”时,输出为( )。
A. “ 0 ”
B. “ 209 ”
C. “ 197 ”
D. “ 226 ”
16.【答案】对【解析】本程序考查位运算的知识点。unsigned short 表示无 符号短整型,数据范围为 0 ~ 65535,占 2 个字节。| 为按位或运 算,& 为按位与运算,<< 为左移运算。需要注意的是 << 运算优 先级高于 |。0x33 表示 十六进制的33,即十进制的510x55 表示十六机制的 55,即十进制的85
17、【答案】 ×【解析】输入为不超过 15 的自然数,改为 char 以 后,当输入为两位数时,x,y 分别读入的是第一个数的十位和个位, 改变了程序的行为和结果。
18、【答案】 ×【解析】略
19、【答案】 ×【解析】代入"2 2",输出结果为"12"。
20、【答案】×【解析】略
21、【答案】B【解析】代入"13 8",输出结果为"209"
#include <algorithm>
#include <iostream>
#include <limits>
using namespace std;
const int MAXN=105;
const int MAXK=105;
int h[MAXN][MAXK];
int f(int n,int m)
{
if(m==1) return n;
if(n==0) return 0;
int ret=numeric_limits<int>::max();
for(int i=1;i<=n;i++)
ret=min(ret,max(f(n-i,m),f(i-1,m-1))+1);
return ret;
}
int g(int n,int m)
{
for(int i=1;i<=n;i++)
h[i][1]=i;
for(int j=1;j<=m;j++)
h[0][j]=0;
for(int i=1;i<=n;i++){
for(int j=2;j<=m;j++){
h[i][j]=numeric_limits<int>::max();
for(int k=1;k<=i;k++)
h[i][j]=min(
h[i][j],
max(h[i-k][j],h[i-1][j-1])+1);
}
}
return h[n][m];
}
int main()
{
int n,m;
cin>>n>>m;
cout<<f(n,m)<<endl<<g[n,m]<<endl;
return 0;
}
假设输入的 n 、 m 均是不超过 100 的正整数,完成下面的判断题和单选题:
判断题
22. 当输入为“ 7 3 ”时,第 19 行用来取最小值的 min 函数执行了 449 次。( )
23. 输出的两行整数总是相同的。( )
24. 当 m 为 1 时,输出的第一行总为 n 。( )
单选题
25. 算法 g(n,m) 最为准确的时间复杂度分析结果为( )。
A. O ( n 3 2 / 𝑚 ) O(n^{\frac{3}{2}}/𝑚)O(n23/m)
B. O ( n m ) O(nm)O(nm)
C. O ( n 2 m ) O(n^2m)O(n2m)
D. O ( n m 2 ) O(nm^2)O(nm2)
26. 当输入为“ 20 2 ”时,输出的第一行为( )。
A. “ 4 ”
B. “ 5 ”
C. “ 6 ”
D. “ 20 ”
27. (4 分) 当输入为“ 100 100 ”时,输出的第一行为( )。
A. “ 6 ”
B. “ 7 ”
C. “ 8 ”
D. “ 9 ”
22、【答案】×【解析】代入模拟计算,共执行了 448 次。亦可通 过递推式根据奇偶性快速判断。
23、【答案】√【解析】两个函数的计算结果是一样的。
24、【答案】√【解析】代入 f 函数,当 m == 1 时,计算结果为 n。
25、【答案】C【解析】i = 1 时,内层两重循环重复 (m-1)次;i = 2 时,内层两重循环重复 2(m-1)次;……i = n 时,内层两重循环重复 n(m-1)次;累加求和,可得∑i(m-1) = n(n+1)(m+1)/2,时间复杂 度为 O()。
26、【答案】C【解析】代入模拟,可以发现 m=2 时,列举出 n 为 1~20 的计算结果为 1 个 1,2 个 2,3 个 3,4 个 4,5 个 5,5 个 6, 因此结果为 6。
27、【答案】B【解析】代入模拟,先计算出 m=1,m=2,m=3 的情况,找出规律,可以发现当 m = 100 的时候,列举出 n 从 1~100 的结果,为 1 个 1,2 个 2,4 个 3,8 个 4,16 个 5,32 个 6,37 个 7,因此结果为 7。
01 #include <iostream>
02
03 using namespace std;
04
05 int n, k;
06
07 int solve1()
08 {
09 int l = 0, r = n;
10 while (l <= r) {
11 int mid = (l + r) / 2;
12 if (mid * mid <= n) l = mid + 1;
13 else r = mid - 1;
14 }
15 return l - 1;
16 }
17
18 double solve2(double x)
19 {
20 if (x == 0) return x;
21 for (int i = 0; i < k; i++)
22 x = (x + n / x) / 2;
23 return x;
24 }
25
26 int main()
27 {
28 cin >> n >> k;
29 double ans = solve2(solve1());
30 cout << ans << ' ' << (ans * ans == n) << endl;
31 return 0;
32 }
假设 int 为 32 位有符号整数类型,输入的 n 是不超过 47000 的自然数、 k 是不超过 int 表示范围的自然数,完成下面的判断题和单选题:
判断题
28. 该算法最准确的时间复杂度分析结果为 𝑂(log 𝑛 + 𝑘) 。( )
29. 当输入为“ 9801 1 ”时,输出的第一个数为“ 99 ”。( )
30. 对于任意输入的 n ,随着所输入 k 的增大,输出的第二个数会变成“ 1 ”。( )
31. 该程序有存在缺陷。当输入的 n 过大时,第 12 行的乘法有可能溢出,因此应当将mid 强制转换为 64 位整数再计算。( )
单选题
32. 当输入为“ 2 1 ”时,输出的第一个数最接近( )。
A. 1
B. 1.414
C. 1.5
D. 2
33. 当输入为“ 3 10 ”时,输出的第一个数最接近( )。
A. 1.7
B. 1.732
C. 1.75
D. 2
34. 当输入为“ 256 11 ”时,输出的第一个数( )。
A. 等于 16
B. 接近但小于 16
C. 接近但大于 16
D. 前三种情况都有可能
28、【答案】√【解析】solve1 函数是二分 O(logn),solve2 函数 是 O(k),都只执行一次,是 O(logn + k)。
29、【答案】√【解析】9801 = 99 × 99,算术平方根为 99。
30、【答案】√【解析】9801 = 99 × 99,算术平方根为 99。
31、【答案】×【解析】n <= 47000, mid <= n/2 <= 23500, mid * mid <= 552,250,000,不会溢出。
32、【答案】C【解析】代入计算,solve1 函数的计算结果为 1,solve2 函数的计算结果为 1.5。
33、【答案】B【解析】√3 = 1.732…,k=10,迭代次数越多精度 越高,因此接近 B。
34、【答案】A【解析】256 = 16 × 16,输出的第一个数等于16。