@P2Oileen
2017-08-05T03:19:17.000000Z
字数 4183
阅读 1588
标★的题目为选做题,仅供学有余力的同学尝试,并且评分标准也更严格。请先做完不标★的题目,再尝试做标一个★的题目,再尝试做更多★的题目。
本次作业总分:30+4.0
3530全国青少年信息学奥林匹克联赛email提交,8.4晚23:33之前(qwq)在这些题目中,我们只考虑通常的NOI Linux比赛环境:计算机的字长为32位,有符号整数类型采用补码(2's complement)方法表示。并且,我们暂且不考虑C++标准的要求,只考虑实际编译器的效果。
对于下面的整数类型,指出其宽度(以二进制位计)、能表示的最小数、能表示的最大数。并指出类型描述的哪些词可以被省略。
例子:signed int,是整数类型,宽度为32,能表示的最小数为-2147483648,能表示的最大数为2147483647,signed可被省略。
(注:C++标准对此宽度的限制仅为“至少为16”,但通常的实践中都是至少为32,在上述的环境中为32,所以本题中我们先不管C++标准对于宽度的限制)
unsigned short intshort short intintunsigned intlong int signedint long unsigned longsigned chardouble| 类型 | 宽度 | 最小数 | 最大数 | 省略后 |
|---|---|---|---|---|
| unsigned short int | 16 | 0 | 65535 | unsigned short |
| short short int | 16 | -32768 | 32767 | short |
| int | 32 | -2147483648 | 2147483647 | int |
| unsigned int | 32 | 0 | 4294967295 | unsigned int |
| long int signed | 64 | -9223372036854775808 | 9,223,372,036,854,775,807 | long long |
| int long unsigned long | 64 | 0 | 18,446,744,073,709,551,615 | unsigned long long |
| signed char | 8 | -128 | 127 | char |
| double | 64 | 1.79769e+308 | 2.22507e-308 | double |
#include <cstdio>int main(){unsigned int a = 233;scanf("%u", &a);if(a == -a){printf("OK\n");return 0;}else return 1;}
输入什么会输出OK?请给出两个答案(如果你只能想出一个就写一个),输入中不能有任何空白字符。
0 2147483648
#include <cstdio>int main(){float a = 2.33;scanf("%f", &a);if(a != a){printf("OK\n");return 0;}else return 1;}
输入什么会输出OK?请给出两个答案(如果你只能想出一个就写一个),输入中不能有任何空白字符。
你最好能够理解以下每个函数的功能。请简单写下以下每个函数的功能,如果你认为你已经熟练掌握则不必写。
这道题为选做题的原因并不是因为难度,而是题太多了……
<cmath>sin log atan2 fmod remainder<cctype>isdigit<cstdlib>atoi strtoul<cstring>strcpy strncpy strcat strncat strlen strcmp strncmp strstrmemcmp memset memcpy memmove
| 库 | 函数 | 功能 |
|---|---|---|
| cmath | sin | 得到角对应的弧度 |
| log | 求以e为底的对数,可以用换底公式得到以其它为底的对数 | |
| atan2 | 求tan的反函数,范围从-pi~pi | |
| fmod | 浮点数取余 | |
| remainder | 除法运算的有符号余数 | |
| cctype | isdigit | 检查c是否为0-9 |
| cstdlib | atoi | 将字符串转换为整型 |
| strtoul | 将字符串转换为无符号整型 | |
| cstring | strcpy | 复制字符串 |
| strncpy | 把指定长度和首指针的字符串复制了 | |
| strcat | 将两个字符串首尾相连 | |
| strncat | 将第二个字符串前n位连到第一个后面 | |
| strlen | 求字符串长度 | |
| strcmp | 比较字符串大小 | |
| strncmp | 比较两字符串的n个字符 | |
| strstr | 判断一个串是否为另一个串的子串 | |
| memcmp | 比较两块内存区域的前n个字节 | |
| memset | 将一块内存区域刷成一个ascii值 | |
| memcpy | 将一块内存拷贝到另一个地方 | |
| memmove | 保证源串在被覆盖前将重叠区域的字节拷到目标区域中 |
#include <cstdio>#include <cstring>#include <ctime>struct Test{char a; int b; short c;};void test(){Test t = {.a = 'a', .b = 2333, .c = 666};Test u ={.a = 'a', .b = 2333, .c = 666};if(memcmp(&t, &u, sizeof(Test)) == 0)printf("t == u\n");else printf("t != u\n");}void magic(){int a[6] = {2, 3, 3, 6, 6, 6};printf("magic %d\n", a[time(0) % 6]);}int main() {for(int i = 0; i < 3; i++){test();magic();}return 0;}
在不同的编译器、编译选项下运行都会得到不同的结果,并且会经常出现t != u的输出,这是为什么呢?难道是因为定义t和u的时候一个大括号换行了而另一个没有???
我觉得这个magic肯定不是看着玩的……所以大概和它有关233333
d1.
g2.
b2.
b3.
d4.
e5.
e6.
i7.
d8.
d10.
d9. ★
b10. ★
d10. ★
e10. ★
i10. ★
可供选择的选项:
A.
B. ,但不是A
C. ,但不是A,也不是B
D. ,但不是以上任何选项
E. ,但不是以上任何选项
F. ,但不是以上任何选项
G. ,但不是以上任何选项
H. ,但不是以上任何选项
I. ,但不是以上任何选项
J. ,但不是以上任何选项
K. ,但不是以上任何选项
L. ,但不是以上任何选项
M. 不是以上任何选项
判断下列代码的时间复杂度。请用大记号,或用你认为最紧的大记号来表示。本题中假定每个变量的取值范围不受计算机字长限制。
O(n^2)
for(i = 1; i <= n; i++)for(j = 1; j <= i; j++)ans++;
O(n^3)
for(i = 1; i <= n; i++)for(j = 1; j <= i; j++)for(k = i; k <= n; k++)ans++;
O(logn)
for(i = 1; i <= n; i *= 2)ans++;
O(nlogn)
for(i = 1; i <= n; i++)for(int j = 1; j <= i; j *= 2)ans++;
O(lognlogn)
for(i = 1; i <= n; i *= 2)for(int j = 1; j <= i; j *= 2)ans++;
O(nlogn)
for(i = 1; i <= n; i++)for(int j = 1; j <= n; j += i)ans++;
O(n)
for(i = 1; i <= n; i *= 2)for(int j = 1; j <= n; j += i)ans++;
O(2^x)
void f(int x) {if(x >= 3) {f(x - 1);f(x - 2);ans++;}}f(n);
O(x)
void f(int x) {if(x >= 2) {f(x / 2);f(x / 2);ans++;}}f(n);
O(x^2)
void f(int x) {if(x >= 2) {f(x / 2);f(x / 2);for(int i = 1; i <= x; i++)ans++;}}f(n);
O(x^2)
void f(int x) {if(x >= 2) {ans++;for(int i = 1; i < x; i++)f(i);}}f(n);
void f(int n, string s) {ans++;if(s.length() < n)for(char c = '0'; c < '0' + n; c++)if(s.find(c) == string::npos)f(n, s + c);}f(n, "");
O(2^x)
void f(x) {if(x >= 4) {f(x - 1);f(x - 3);ans++;}}f(n);
提示:实在判断不准的,可做实验试试。
对于每道题,回答“对”或“错”或“目前无法确定”。
对1. 如果存在一个NP-完全问题能被确定图灵机在多项式时间内解决,则所有NP问题都能被这样解决。
错2. 任何NP问题都不是P问题。
对3. 存在一个问题,既是NP问题,又是NP-难问题。
错4. ★存在一个问题,既是P问题,又是NP-完全问题。
目前无法确定5. ★如果存在一个NP-难问题能被确定图灵机在多项式时间内解决,则所有NP-完全问题都能被这样解决。