L1-005 考试座位号 (15 point(s))

  • 因为不涉及运算,并且准考证号为 16 位大于 int 10^9 所以三个数据准考证号、试机座位号和考试座位号都可以定义 string 类型。

    1041 考试座位号 (15 point(s)) 看了下以前写的,这题用 long long 是可以的,所以准考证号高位不存在 0 的情况。这种长字符串用 long long 比较担心的点就在于高位存在 0 的情况。因为有 0 就会被自动忽略,跟结果的输出就不一样了。

  • 1074 宇宙无敌加法器 (20 point(s)) 之前探讨过数据类型的实际范围,这次又想了想自己 int 10^9 long long 10^18 这有没有记错。实际上很多复制粘贴的代码里面说 这两个代表 int 10位和 long long 20位是有偏差的。看 int 的表示范围 -2147483648~+2147483647 数起来确实有十个数字,但是第十位是不满 9 的,意味着第十位大于等于 3 的时候,数据就会溢出了。所以实际能够完全表示的是 10 - 1 = 9 位。

    对 unsigned int、long long、unsigned long long 同理,他们的数据范围分别是 0 ~ 42 9496 7295, -922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807、 0 ~ 1844 6744 0737 0955 1615 。数字位分别是 10 19 20,用上面的思路对个位数减一,实际能够完全表达的位数分笔试 unsigned int = 10^9 , long long = 10^18 , unsigned long long = 10^19 。

    所以以后看到数据范围的时候应该警醒一点,别用错类型导致BUG。这种数据溢出的BUG可不好发现。

    c语言long和long long的取值范围

#include <bits/stdc++.h>
using namespace std;

struct Stu{
	string id, loc;
};

int main(){
	int N, M;
	map<string, Stu> stu;
	
	cin >> N;
	while(N--){
		string id, tmp, loc;
		cin >> id >> tmp >> loc;
		stu[tmp] = {id, loc};
	}
	
	cin >> M;
	while(M--){
		string tmp;
		cin >> tmp;
		cout << stu[tmp].id << " " << stu[tmp].loc << endl;
	}
} 
上一篇:005键盘输入


下一篇:L2-005 集合相似度 (25 分)