五一集训讲课内容(4.28-5.2)
五一集训讲课内容(4.28-5.2)
比赛注意
开头写文件读入、写出的两行代码。
freopen("文件名.in","r",stdin);
freopen("文件名.out","w",stdout);
内存限制为256MB最多开6e7的int型数组
内存限制为512MB最多开1e8的int型数组
1e9的数组绝不能开!!!
时间限制1000ms,for循环最多循环1e9次
大量数据(1e6以上)读入要用scanf
(基础语法回顾)
基本数据类型
数据名称 | 数据范围(二进制) | 数据范围(十进制) | 数据格式 |
---|---|---|---|
int(整数类型) | \(-2^{31}\sim2^{31}-1\) | \(-2\times10^9\sim2\times10^9\) | %d |
long long(整数类型) | \(-2^{63}\sim2^{63}-1\) | \(-9\times10^{18}\sim9\times10^{18}\) | %lld |
unsigned long long(整数类型) | \(0\sim2^{64}-1\) | \(0\sim1\times10^{19}\) | %lld |
float(浮点数类型) | \(-3.4\times10^{-38}\sim3.4\times10^{38}\)(有效位数\(6\sim7\)位) | %f | |
double(浮点数类型) | \(-1.7\times10^{308}\sim1.7\times10^{308}\)(有效位数\(15\sim16\)位) | %lf | |
char(字符类型) | \(-128\sim127\) | %c | |
bool(布尔类型) | 0或1 |
scanf、prinf用法
scanf读入屏蔽
int a,b,c;
scanf("%d+%d,%d",&a,&b,&c);
printf("%d %d %d",a,b,c);
// 键盘输入:1+2,3
// scanf可以无视“+”使得a,b,c值分别为1 2 3
printf用法
int a=123;
long long b=12345678900;
double c=3.14;
printf("%d %lld %lf",a,b,c); //输出123 12345678900 3.140000
double a=3.145;
printf("%.2lf",a); //double保留2位小数
int a=1;
printf("%3d",a); //%3d表示输出3位整型数,不足位数右对齐左边用空格填充
printf("\n");
printf("%03d",a); //%03d表示输出3位整型数,不足位数用0填充
注意:printf 中没有&,scanf 中才有
变量作用域
作用域是变量可以发挥作用的代码块。
全局变量的作用域,自其定义之处开始,至文件结束位置为止。全局变量在定义时若没有赋初值,其默认值为 0。
局部变量的作用域,自其定义之处开始,至代码块结束位置为止。
由一对大括号括起来的若干语句构成一个代码块。
#include<bits/stdc++.h>
using namespace std;
int g = 20; // 定义全局变量
int main()
{
int g = 10; // 定义局部变量
printf("%d\n", g); // 输出 g
for(int i=1;i<=5;i++)
printf("%d\n",i);
// printf("%d",i);
return 0;
}
算术运算符
算术运算符 | 功能 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取模 |
++ | 自增 |
-- | 自减 |
注意:%只能整数取模,小数不能取模
关系运算符
关系运算符 | 功能 |
---|---|
> | 大于 |
< | 小于 |
== | 等于 |
>= | 大于等于 |
<= | 小于等于 |
!= | != |
逻辑运算符
&&与、||或、!非、^异或
a&&b:当a、b都为真(非零)时,其为1。
a||b:当a、b至少有一个为真(非零),其为1,否则为0。
!:!a,当a为假(0)时,其为1,a为真(1)时,其为0。
a^b:当两个条件刚好一个为真(非零)时,其为1,否则为0。
注意:
int a=-1;
if(-10<=a<=0) //-10<=a<=0 无这种写法
printf("yes1");
if(-10<=a&&a<=0) // -10<=a&&a<=0 正确写法
printf("yes2");
(常用函数)
数学函数
函数 | 含义 | 写法 | 举例 |
---|---|---|---|
double sqrt(double x) | 对x开平方 | a=sqrt(9) | a=3 |
double pow(double x,double y) | 求x的y次方 | a=pow(3,2) | a=9 |
int abs(x) | 求整数的绝对值 | a=abs(4),b=abs(-3) | a=4,b=3 |
double abs(double x) | 求实数的绝对值 | a=fabs(4.0),b=fabs(-3.5) | a=4.0,b=-10 |
double ceil(double x) | 向上取整,值是大于等于x的最小整数 | a=ceil(3.1),b=ceil(-10.5) | a=4,b=-10 |
double floor(double x) | 向下取整,值是小于等于x的最大整数 | a=floor(3.1),b=floor(-10.5) | a=3,b=-11 |
memset数组清零
例子:
int a[50];
memset(a,0,sizeof(a));
//将数组内50个元素值全部清零,
// 中间只能赋值0或-1,给数组所有元素赋值0或-1
for(int i=0;i<50;i++)
printf("%d\n",a[i]);
(字符串)
字符数组
字符数组读入方法
用 scanf 读入整个数组:scanf("%s",s);
用 scanf 逐个元素读入:scanf (“%c”,&s[0]);…注意:可能
会读入回车
用 cin 输入整个数组:cin>>s
用 cin 逐个元素输入:cin>>s[0];…不会读入回车
用 fgets 读入一行:fgets(s,sizeof(s),stdin); …可以读入空格,遇到
换行符后结束,换行符作为 s 的最后一个字符
字符数组输出方法
用 cout 输出整个数组:cout << s; …最常用
用 cout 逐个元素输出:cout<<s[0];…
用 printf 逐个元素输出:printf ("%c",s[0]);…
用 puts 输出一行并回车:puts(s);
字符数组常用函数
strlen()表示字符数组长度,以'\0'为结束标志。
例如:
char a[50]="123";
int len=strlen(a);
cout<<len;//len为3
gerchar()读一个字符,可以是空格和换行。
例如:
char a=getchar();//读取一个字符赋值给a
getchar();//读取一个字符
sscanf(s,”%d”,&n); 从字符数组 s 中读取数字,并赋值给n。
例如:
char s[100]="123 45";
int a,b;
sscanf(s,"%d %d",&a,&b);
printf("%d %d",a,b);//输出123 45
sprintf(s,”%d”,n); 把一个 int 类型的数 n 输出到字符串 s 中。
例如:
char s[100];
sprintf(s,"%d+%d=%d",1,2,3);
printf("%s",s);输出1+2=3
strcpy(a,b)将b字符数组的数据复制到a
例如:
char a[100];
strcpy(a,"hello"); //给字符数组赋值常量
char b[100];
strcpy(b,a);// a字符数组的数据复制到b
printf("%s %s",a,b);//输出hello hello
(不能直接给字符数组赋值,除非在定义时初始化:char a[100]="hello")
strcmp(a,b)按照字典序比较两个字符串(从左到右比较两个字符串中字符的ASCII值,相同则比较下一位),a>b返回1,a<b返回-1,a==b返回0
例如:
char a[100]="a";
char b[100]="b";
if(strcmp(a,b)>0)
printf("a>b");
else if(strcmp(a,b)==0)
printf("a==b");
else
printf("a<b"); //输出a<b
STL中的string类型
string输入
初始化string str="sbcd"
带空格整行读入 getline(cin,str);
string输出
输出单个字符可以用 printf:
for(int i = 0; i < str.size(); i++) printf( “ %c “ ,str[i]);
输出 abcd
要读入或者输出整个字符串,一般只能用 cin 和 cout
string 的运算
字符串可以做“加法”运算。加法是把两个字符串直接拼接起来
例如:
string str1="123",str2="456";
string str3=str1+str2;
cout<<str3;//输出123456
字符串还可以做“关系”运算,是按照字典序比较两个 string 类型的大小。
例如:
string str1="aa",str2="aaa",str3="abc";
if(str1 < str2) printf( "OK1" );// 输出OK1
if(str1 < str3) printf("OK2");// 输出OK2
string常用函数
s_str() 将 string 转换成字符数组
s.size()和s.length()一样 求字符串s的长度
s[i] 下标为i的字符
s1+s2 连接s1和s2字符串
s1=s2 s1替换成s2字符串
s1==s2 比较两个字符串是否相同
! = < > <= >= 按字典序比较
s.insert(pos,s2) 在s下标为pos的元素前插入s2字符串
s.substr(pos,n) 从s中提取下标pos起的n个字符,相当于是一个字符串
s.erase(pos,n) 删除下标pos起的n个字符
s.find(s2,pos) 在s下标为pos的元素起查找s2首次出现的位置,如果找不到,返回string::npos。将其强制转换为int类型后才是-1。