快读 # 字符串 # 进制转化 # 一些常错的白痴问题 # 一些奇奇怪怪的函数
快读
只用cin
和cout
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
解除的是C++运行库层面的对数据传输的绑定,取消输入输出时数据加入缓存,以提高效率
开快读以后 cin和cout 不能和scanf printf混用 否则会出错。(std不同步以后prinf可能会先于cout)
或者数据规模大于100万直接用scanf
和printf
字符串
读入单个字符
用char
定义字符数组读,或者用string
直接读入字符串
不要写char a
防止输入有多余空格回车
二维数组和一维数组的转化
int x = k / n, y = k % n
其中k
为一维数组的下标,x、y
为二维数组的下标,n
为二维数组的列数
进制转化
十进制转化为任意进制:短除
char get(int x)
{
if(x <= 9) return x + '0';
return x - 10 + 'A';
}
string base(int n, int b)//n为输入整数,b为要转化的进制
{
string num;
while(n) //将十进制转化为b进制
{
num += get(n % b); // 将求得的数转化为字符并加入到字符串中
n /= b;
}
reverse(num.begin(), num.end()); //将字符串倒序
return num;
}
任意进制转化为十进制
int uget(char c) {
if(c <= '9') return c - '0';
return c - 'A' + 10;
}
int base(string num, int b) {
int res = 0;
for(auto c : num) {
res = res * b + uget(c);
}
return res;
}
自己常错的一些白痴问题
- 注意双重循环的循环终止条件!!!!
- 需要更新最大值的时候不要从0开始更新,从负数开始更新!!! 洛谷 2004 领地选择 这个题如果更新最大值初始设置成0会导致wa掉最后一个测试点
- 注意数据范围!!!需要开long long的就要开long long
函数
hypot(x, y)
和sqrt(x * x + y * y)
作用相同
C++ 的四舍六入五留双
#include <bits/stdc++.h>
using namespace std;
int main() {
double d;
int n;
cin >> d >> n;
cout << fixed << setprecision(n) << d << endl;
printf("%.*lf\n", n, d);
// 两种输出方法等价
return 0;
}
c++中的istringstream
istringstream
类用于执行C++风格的串流的输入操作。
istringstream
的构造函数原形如下:
istringstream::istringstream(string str);
它的作用是从string对象str中读取字符。
#include<iostream>
#include<sstream> //istringstream 必须包含这个头文件
#include<string>
using namespace std;
int main() {
string str="I am wk";
istringstream is(str);
string s;
while(is >> s) {
cout << s << endl;
}
}
输出是:
I
am
wk