输入输出

cin/cout 与 scanf/print

  • 万能头文件#include
  • cin 与 cout 是 C++ 提供的函数输入输出方便但速度较慢,所以需 要用指令进行输入输出加速,切记使用加速命令后不要同时使用 cin/cout 与 scanf/printf
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int x, y;
cin >>x >> y;
cout << y << endl << x;
return 0;
}
  • scanf 与 printf 其实是 C 语言提供的函数。大多数情况下,它们 的速度比 cin 和 cout 更快,并且能够控制输入输出格式
  1. %s 表示字符串。
  2. %c 表示字符。
  3. %lf 表示双精度浮点数 ( double ) 。
  4. %lld 表示长整型 ( long long ) 。
  5. %llu 表示无符号长整型 ( unsigned long long ) ,无符号整数不能读 入负数。

多组输入

我们在输入输出的时候要遵守题目的输入输出格式规范常见的有以下几种 输入方式

有条件的多组输入

无条件的多组输入

利用 while 循环进行读入,但输入的时候你可能发现程序无法退出,这时候 需要输入 ctrl + z 再按下回车就可以正常结束程序。

getline 读入带空格的字符串

我们在读入字符串的时候如果用 cin 或 scanf 会无法读入空格,因为 cin 或 scanf 读入空格后会认为字符串读入已经结束。所以我们需要用 getline 读入带空格的字符串。

getline 与 cin 混用产生的问题及字符串与数字的转换

简单来讲就是 cin 会剩一个换行符,getline 会把这个换行符读进来导致 直接结束字符串读入。 所以说我们在使用的时候,尽量避免 getline 与 cin 混用。

使用stoi 函数将字符串转化为了数 字,如果想将数字转化为字符串可以使用 to_string() 指令

日期问题

模板

#include<bits/stdc++.h>
using namespace std;
int main(){

for(int year=2014; year<=2018; year++){
for(int month=1; month<=12; month++){
for(int day=1; day<=31; day++){
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12);
else if(month==2){
if((year%4==0 && year%100!=0) || year%400==0){
if(day>29) break;
}else{
if(day>28) break;
}
}
else{
if(day>30){
break;
}
}

}
}
}
return 0;
}



int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int date)
{
int year = date / 10000; //年
int month = date % 10000 / 100; //月
int day = date % 100; //日
if(!month || month > 12 || !day ) return false;//如果月份大于12或者为零或者天数为零则该日期不合法
if(month != 2 && day > months[month]) return false;//在不是二月的情况下,该月实际天数大于该月最大天数,则该日期不合法
if(month == 2) //特判二月
{
if((year % 4 == 0&& year % 100 != 0) || (year % 400 == 0))//特判闰年
{
if(day > 29) return false;
}
else if( day > 28) return false;
}
return true;
}

题目描述

已知今天是星期六 ,请问20的22次方天后是星期几? 注意用数字1到7表示星期一到星期日。

快速幂算法

#include <iostream>
using namespace std;

// 快速幂函数,计算 a 的 b 次方对 m 取模的结果
long long fastPower(long long a, long long b, long long m) {
long long result = 1;
a = a % m;
while (b > 0) {
if (b & 1) {
result = (result * a) % m;
}
a = (a * a) % m;
b =>> 1;
}
return result;
}

int main() {
int today = 6; // 今天是星期六,用 6 表示
long long daysAfter = fastPower(20, 22, 7); // 计算 20 的 22 次方对 7 取模的结果
int finalDay = (today + daysAfter) % 7;
if (finalDay == 0) {
finalDay = 7; // 如果结果为 0 表示星期日,转换为 7
}
cout << finalDay << endl;
return 0;
}

STL

map 及其函数

priority_queue 优先队列

因为堆的作用主要是用来获取最大 / 最小值,类似队列的取最值操作,因此 堆有一个别名叫优先队列。在 STL 中提供了 “ 优先队列 “ 的模板,即 priority_queue。关于优先队列具体的应用会在二叉堆与对顶堆中详细讲 解。

重载比较函数是,return true代表第一个参数的优先级低于第二个优先级,优先级最高的在队首