前言
对于C++党来说,最烦的就是 int 和 long long 的区别了吧。C++繁多的数据量,让我们防不胜防。(十年OI一场空,不开longlong见祖宗)。所以本文浅谈一下各类数据结构的特点,以及如何判断使用哪种数据结构。
各数据结构特点
- 整数型
(short由于及其不常用不计入)
数据名字 | 数据中文名 | 起始值 | 结束值 |
---|---|---|---|
int | 整型 | ||
unsigned int | 无符号整型 | ||
long long | 长整数型 | ||
unsigned long long | 无符号长整数型 |
- 小数型
数据名称 | 数据精度(小数点位) |
---|---|
float | |
double |
如何使用?
- 整型
事实上,整数的使用是最为困难的。如果我们选择使用int,万一出现这种毒瘤数据,那就相当于放弃了到手的AC;但如果选择long long,就会出现很难调节的问题(容易出现MLE),所以,我选取了三个非常经典的事例,分析这三种情况。
1. int 类
int是使用最多的数据类型。不妨看到洛谷的P1001。里面有这么一句话:
我们知道,int最大可存约 的大小,而本题中 a 与 b 相加得到的最多是
,int类型就完全足够使用了。即可写出代码。
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin >> a >> b;
int s;
s = a + b;
cout << s << endl;
return 0;
}
结论:当单个数据的大小小于等于 ,且没有大数据的乘、加,经过粗略计算不会超过int范畴的时候,应当使用int类型。
2. long long 类
重点讲一下用long long的时候。
看到例题:P10567,里面有这么一句话:
看到了吗?保证 ,这意味着 int 类型是完全无法存下的,需要更大的类型(longlong)来存下这个 n。所以本题使用longlong类型,可写出代码如下。
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n;
cin >> n;
if (n % 2 == 1){
puts("No");
}
else {
puts("Yes");
}
return 0;
}
再来看到这个例题:P5534,乍眼一看, 的大小,int就够用了吧?
其实不够。虽然表面上看可以,但如果公差 d 就是 ,n 又取最大(
)呢?简单算算,发现结果是
,int 是完全存不下的,要用longlong,故写出代码。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int s[1000005] = {};
signed main(){
cin >> s[1] >> s[2];
int d = s[2] - s[1];
int n;cin >> n;
int cnt = s[1] + s[2];
for (int i=3;i<=n;i++){
s[i] = s[i-1] + d;
cnt += s[i];
}
cout << cnt;
return 0;
}
(注:上代码中提到的#define int long long,代表所有int实际上均为longlong类型,是简化代码的好方法,但如果写了这一行,main的定义就请写signed main,否则CE。)
结论:当单个数据大小较大,超过了int所能承受的范围;或单个数据虽然较小,但因大数的乘法造成数据大小指数级增长,粗略估算会超过int承受范围的,应当使用longlong数据类型。
- 浮点型(小数型)
浮点型没有什么要强调的点,如果题目要求使用单精度,请用 float 类型;但如果要求双精度或无特别要求的情况下,统一使用精度较高的 double。
结语
C++ 的数据结构使用是一门学问,只有在刷题中不断找到适合题目的使用方法,才有可能不被数据结构“坑”到,找回那本属于你的分数!
--- END ---
--- 全文完 ---