2 数据类型
2 数据类型
位(bit)
位(bit)是计算机能够存储信息的最小单位。
字节(byte)
字节( byte )是计算机存储信息的基本单位。1 字节byte 等于 8 位bit。
更大的存储单位
单位名称 换算关系
千字节(KB) 1 KB = 1024 B
兆字节(MB) 1 MB = 1024 KB
吉字节(GB) 1 GB = 1024 MB
太字节(TB) 1 TB = 1024 GB、
练习
2-1 一个字节(byte)由( )个二进制位组成。
A 8
B 16
C 1024
2-2 一片容量为8G的SD卡能储存大约( )张大小为2MB的数码照片。
A 1600
B 2000
C 4000
D 16000
图像存储
如何计算一张图片大小
一张图片大小(单位为bit) = 水平像素数 × 垂直像素数 × 位深度
位深度:存储图片一个像素需要消耗多少位。可能是4位、8位、24位、32位。

例:存储一张2048 * 1024像素的32位真彩色图像,需要多大内存?
答:2048 * 1024 * 32 bit = 8 MB
分辨率
分辨率是指每英寸图像内像素点的个数,单位为PPI(Pixels Per Inch);像素点越多,分辨率越高,图像越清晰。
练习
2-3 现有一张分辨率为 2048×1024 像素的 32 位真彩色图像。请问要存储这张图像,需要多大的存储空间?( )。
A. 16MB
B. 4MB
C. 8MB
D. 2MB
2-4 1MB 等于( ).
A. 1000 字节
B. 1024 字节
C. 1000×1000 字节
D. 1024×1024 字节
2-5 分辨率为 800x600、16 位色的位图,存储图像信息所需的空间为( )。
A. 937.5KB
B. 4218.75KB
C. 4320KB
D. 2880KB
2-6 地址总线的位数决定了 CPU 可直接寻址的内存空间大小,例如地址总线为 16 位,其最大的可寻址空间为 64KB。如果地址总线是 32 位,则理论上最大可寻址的内存空间为( )。
A. 128KB
B. 1MB
C. 1GB
D. 4GB
基本数据类型及其占位符

字符串
string s = "abcde", k = "defgh";
string s1 = s.substr(2); //则s1等于"cde",从s的第2位开始截到末尾
string s2 = s.substr(1, 3); //则s2等于"bcd",从s的第1位开始截取3位
int a = s1.compare(s2); //因为s1的字典序更大,则a的结果为1
string s3 = s.erase(2); // s3为ab,从下标2开始把全部的字符删除
string s4 = s2.erase(1, 1); //s4为bd,从下标1开始只删除一个位
s1.erase(s1.begin()); // 删除s1的第0位,得到de
k.erase(k.begin()+2, k.begin()+3); // k为"degh"
练习
2-7 为了精确读入一个小数点后有10位的小数,应该使用下列哪种数据类型?
A int
B char
C float
D double
2-8 以下程序会输出什么?
char a[5] = "Lily";
char b[5] = "Nana";
int t = strcmp(a, b);
printf("%d", t);
A 正数
B 负数
C 0
2-9
01 #include <iostream>
02
03 using namespace std;
04
05 int main()
06 {
07 unsigned short x, y;
08 cin >> x >> y;
09 x = (x | x << 2) & 0x33;
10 x = (x | x << 1) & 0x55;
11 y = (y | y << 2) & 0x33;
12 y = (y | y << 1) & 0x55;
13 unsigned short z = x | y << 1;
14 cout << z << endl;
15 return 0;
16 }
假设输入的 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”
2-10
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. 前三种情况都有可能
2-11
1 #include <cstdlib>
2 #include <iostream>
3 using namespace std;
4
5 char encoder[26] = {'C','S','P',0};
6 char decoder[26];
7
8 string st;
9
10 int main() {
11 int k = 0;
12 for (int i = 0; i < 26; ++i)
13 if (encoder[i] != 0) ++k;
14 for (char x ='A'; x <= 'Z'; ++x) {
15 bool flag = true;
16 for (int i = 0; i < 26; ++i)
17 if (encoder[i] ==x) {
18 flag = false;
19 break;
20 }
21 if (flag) {
22 encoder[k]= x;
23 ++k;
24 }
25 }
26 for (int i = 0; i < 26; ++i)
27 decoder[encoder[i]- 'A'] = i + 'A';
28 cin >> st;
29 for (int i = 0; i < st.length( ); ++i)
30 st[i] = decoder[st[i] -'A'];
31 cout << st;
32 return 0;
33 }
•判断题
1) 输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( )
2) 若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样。()
3) 将第 12 行的“i<26”改为“i<16”,程序运行结果不会改变。( )
4) 将第 26 行的"i<26”改为“i<16”,程序运行结果不会改变。( )
•单选题
5) 若输出的字符串为“ABCABCABCA”,则下列说法正确的是( )。
A. 输入的字符串中既有S又有P
B. 输入的字符串中既有S又有B
C. 输入的字符串中既有A又有P
D. 输入的字符串中既有A又有B
6)若输出的字符串为“CSPCSPCSPCSP”,则下列说法正确的是( )。
A. 输入的字符串中既有P又有K
B. 输入的字符串中既有J又有R
C. 输入的字符串中既有J又有K
D. 输入的字符串中既有P又有R
2-12
#include<iostream>
using namespace std;
int main()
{
string ch;
int a[200];
int b[200];
int n, i, t, res;
cin >> ch;
n = ch.length();
for (i = 0; i < 200; i++)
b[i] = 0;
for (i = 1; i <= n; i++)
{
a[i] = ch[i - 1] - '0';
b[i] = b[i - 1] + a[i];
}
res = b[n];
t = 0;
for (i = n; i > 0; i--)
{
if (a[i] == 0)
t++;
if (b[i - 1] + t < res)
res = b[i - 1] + t;
}
cout << res << endl;
return 0;
}
输入:1001101011001101101011110001
输出:_________
2-13
#include<iostream>
using namespace std;
int main()
{
int t[256];
string s;
int i;
cin >> s;
for (i = 0; i < 256; i++)
t[i] = 0;
for (i = 0; i < s.length(); i++)
t[s[i]]++;
for (i = 0; i < s.length(); i++)
if (t[s[i]] == 1)
{
cout << s[i] << endl;
return 0;
}
cout << "no" << endl;
return 0;
}
输入:xyzxyw
输出:_________
输出:_________
2-14
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
int i;
int count; count = 0;
getline( cin, str );
for ( i = 0; i < str.length(); i++ )
if ( str[i] >= 'a' && str[i] <= 'z' )
count++;
cout << "It has " << count << " lowercases" << endl;
return(0);
}
输入:NOI2016 will be held in Mian Yang.
输出:_______

浙公网安备 33010602011771号