基础框架

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

	return 0;
}

基础输入输出

int(整数),char(字符),short(短整数[基本不用]),int(整数 -2147483647 ~ 2147483648),
long long(长整数 -9223372036854774808 ~9223372036854774807),
double(双精度浮点数,实数,小数),float(单精度浮点数[几乎不用]),bool(布尔[判断真假])
int x;// 声明一个整数变量x
cin>>x; //输入x变量的值
cout<<x; //输出x变量的值
cout<<fixed<<setprecision(k)<<x;//保留k位小数
cout<<setw(k)<<x;//x如果小于k位,则占k个字符位置,否则就按照实际的长度占位置
cout<<setw(k)<<setfill(ch)<<x;//x如果小于k位,则占k个字符位置,不足的部分就补上ch字符,否则就按照实际的长度占位置

%c(字符占位符),%lf(double类型的占位符),%d(int的占位符),%lld(long long的占位符)
scanf("%d %d",&a,&b);		//获取a和b两个int变量的数值 
printf("%.2lf",a);			//保留2位小数输出a变量的值 


四则运算
+(加),-(减),*(乘),/(商), %(余)
注意:
1.余数的正负由被除数决定
2.浮点数没有取余运算
3.如果a和b都是整数,则a/b会得到a除以b的商。

char ch='k'
int x=ch;//这样可以得到变量ch表示的字符的ascii码
int x=round(t),//x为t四舍五入以后得到的结果
1.上取整
(a+b-1)/b

2. 换水问题
int t=a;
a=b;
b=t;

3.拆数
求某一位就是除以多少,然后%10
例:x的百位     x/100%10;

4.四舍五入
int k=round(x)// k是 x 4舍5入的结果

常见的ascii

'0'~'9' 48~57
'A'~'Z' 65~90
'a'~'z'  97~122
' '   32

条件语句

if判断

if(条件1)
{
	//语句1	
} 

if(条件1)
{
	//语句1
}
else
{
    //其它语句	
}

if(条件1)
{
	//语句1
}
else if(条件2)
{
	//语句2
}...
else
{
    //剩余语句	
}
逻辑连接符
a&&b 只有a和b同时为真的时候整个语句为真
a||b 只要a和b有一个为真的时候整个语句为真
!a 当a为假的时候,整个语句为真

运算符优先级 !>&&>||

1.绝对值
1.1 
if(x<0)
{
	x=x*-1;	
} 
1.2
x=abs(x)
2. 奇偶数判断
2.1 奇数判断
if(n%2!=0)
{
	//当n为奇数的时候执行 
}
2.2 偶数判断
if(n%2==0)
{
	//当n为偶数的时候执行 
}
3.字符类型判断
if(ch>='a'&&ch<='z')
{
	//小写字符判定 
}

if(ch>='A'&&ch<='Z')
{
	//大写字符判定 
}

if(ch>='0'&&ch<='9')
{
	//数字字符判定 
}
4.闰年判断
if(year%4==0&&year%100!=0||year%400==0)
{
	//当year为闰年的时候执行 
}

开关语句

switch(n)
{
	case 1:
		//语句
		break;
	case 2:
		//语句2
		break;
	default: 
		//默认语句 
}

循环语句

while循环

状态初始化
while() //状态判断 
{
	//语句块	
	//状态更新 
}

遍历 m到n之间的所有数(包括m和n)
int t=m;
while(t<=n)
{
    //t为m到n之间的每个数
    t++;
}

先执行语句块再进行条件判断
do
{
	//语句块 
}while() //状态判断

拆数模板

while(t)
{
	int ge=t%10;
	//对当前个位进行操作 
	t/=10;
}
//拆数完成以后,t的值为0

翻转数模板
int res=0;
while(t)
{
	int ge=t%10;
	res=res*10+ge;
	t/=10;
}
//res是t翻转以后的结果

for循环

for(初始化;判断;更新)
{
	语句块;	
}

1.输出a到b之间的数
for(int i=a;i<=b;i++)
{
    cout<<i<<" ";
}

2.求和模板
int s=0;
for(int i=1;i<=n;i++)
{
    int x;
    cin>>x; 
    s+=x;
}

3.最大值模板
3.1 maxv初始化
int maxv=-1; //(初始化成最小值)
for(int i=1;i<=n;i++)
{
	int x;
	cin>>x;
	if(x>maxv)
	{
		maxv=x;
	}
}

3.2 maxv不初始化
int maxv;
for(int i=1;i<=n;i++)
{
	int x;
	cin>>x;
	if(i==1||x>maxv) //如果是第一个,或者当前元素比最大值大
	{
		maxv=x;
	}
}

4.最小值模板
4.1 minv初始化
int minv=1000; //(初始化成较大值)
for(int i=1;i<=n;i++)
{
	int x;
	cin>>x;
	if(x<minv)
	{
		minv=x;
	}
}
4.2 minv不初始化
int minv;
for(int i=1;i<=n;i++)
{
	int x;
	cin>>x;
	if(i==1||x<minv)
	{
		minv=x;
	}
}

5.统计类模板
int cnt=0;
int m;
cin>>m;
for(int i=1;i<=n;i++)
{
	int x;
	cin>>x;
	if(x==m) //判断当前元素是否等于x 
	{
		cnt++;	
	}	
}

6.次方类题目(a^b)
int s=1;
for(int i=1;i<=b;i++)
{
	s=s*a;
}

7.质数判断
bool st=true;
int n;
cin>>n;
if(n<2) //小于2不在质数的判定范围以内 
{
	st=false;
}
for(int i=2;i<=n/i;i++) //枚举小因子 
{
	if(n%i==0) //存在小因子 
	{
		st=false;
	}
}
if(st==true)
{
	//满足质数需要执行的内容 
}
else
{
	//不满足质数需要执行的内容 
}

8.枚举类题目(百钱百鸡)
for(int i=0;i<=20;i++) //公鸡的数目 
{
	for(int j=0;j<=33;j++) //母鸡的数目 
	{
		for(int k=0;k<=100;k+=3) //小鸡的数目 
		{
			if(i+j+k==100&&5*i+3*j+k/3==100) //百钱百鸡 
			{
				cout<<i<<" "<<j<<" "<<k<<endl;
			}
		}
	}
}

break 语句
循环
{
	if(条件1)
	{
		break;	
	}	
	语句1 
}
语句2  //当条件1条件为真时,直接跳到语句2执行


continue
循环
{
	if(条件1)
	{
		continue;	
	}	
	语句1 
}
语句2  //当条件1条件为真时,跳到循环的那句继续执行

数组

一维数组


数组: 数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。
组成数组的各个变量称为数组的元素。用于区分数组的各个元素的数字编号称为下标。
一般为了方便会比题目多开10个空间 
int a[100];//声明一个可以存放100个元素的整数数组 
int a[100]={1,4,2};//将a[0]=1,a[1]=4,a[2]=2
memcpy(a,b,sizeof b);//等价于一般变量的a=b;
一般我们会使用一个常量来声明数组的大小
const int N=110; //声明一个大小为110的常量N 
int a[N]; //声明一个可以放110个元素名为a的数组 

//输入n个元素的数组,数组变量名是i,下标从1开始 
for(int i=1;i<=n;i++)
{
	cin>>a[i];
} 

//顺序输出输出的每个元素
for(int i=1;i<=n;i++)
{
	cout<<a[i]<<" "; //元素和元素之间用空格隔开 
} 
 
//元素之间需要输出逗号的时候,我们一般会让逗号跟着前面一个元素或者是后面一个元素

//前一个元素
for(int i=1;i<n;i++)
{
	cout<<a[i]<<",";
}
cout<<a[n]; 

//后一个元素
cout<<a[1];
for(int i=2;i<=n;i++)
{
	cout<<","<<a[i];
}

//冒泡排序
for(int i=1;i<=n;i++) //每轮确定一个元素的位置 
{
	for(int j=1;j+1<=n-i+1;j++) //第i轮确定第n-i+1这个位置上的值 
	{
		if(a[j]>a[j+1]) //比较相邻的两个元素 
		{
			swap(a[j],a[j+1]);
		}
	}
} 

//标记法
a[i]=1,a[j]=1,a[k]=1,表示位置i,j,k位置具有相同的属性
a[o]=2,a[p]=2,a[q]=2,表示位置o,p,q位置具有相同的属性

//最长平台
for(int i=1;i<=n;i++)
{
	int j=i;
	while(j<=n&&满足属性) j++;
	j--;
	//这个时候i是当前平台的第一个元素,j是当前平台的最后一个元素 
	i=j;	//跳到平台的最后一个位置 
}

字符数组

char s[100] //声明一个字符类型的字符数组(字符数组需要\0结束,所以只能存放99的字符)
cin>> s;//读取不包含空白字符的字符数组,从s[0]开始储存
cin>> s+1;//读取不包含空白字符的字符数组,从s[1]开始储存
cin.getline(s,N) ;//读取可以包含空白字符的字符数组,从s[0]开始储存

int n=strlen(s);//计算从s[0]开始的有效字符的长度

字符数组的遍历
for(int i=0;i<strlen(s);i++)
{
    //对s[i]进行操作
}

strcpy(s1,s2) //将s2的内容拷贝到s1
strcat(s1,s2) //将s2的内容添加到s1
strcmp(s1,s2)
如果s1的字典序>s2的字典序则返回整数
如果s1的字典序=s2的字典序则返回0
如果s1的字典序<s2的字典序则返回负数

cout<<s;//输出字符数组s的所有有效字符

常见的ascii规则
1.数字比字母小。 如'7'<'F'
2.数字0小于数字9,且按照0到9一次递增。如'0'<'2'且'0'+2==2
3.字母A(a)比字母Z(z)小,且按照顺序递增
4.大写字母的ascii码小i与小写字母的ascii码。'A'<'a'
常见的ascii: 'A'为65;'a'为97;'0'是48,空格是32
标准的ascii为0~127

字符串

可以看成字符数组的集合
string s;//声明一个字符串
cin>>s;//获取不包含空白字符的字符串
getline(cin,s) ;//获取可以包含空白字符的字符串
string s=string(3,'c'); //s是一个包含3个'c'的字符串

int n=s.size() //得到字符串s的长度
字符串中每个字符的遍历
for(int i=0;i<s.size();i++)
{
    //对每个字符串中的每个字符进行操作
}
s1.find(s2)//在s1中查找s2出现的位置,如果找不到返回无符号整数的最大值(转成int以后等于-1)
s1.insert(pos,s2) //在pos的前面插入s2
s1.substr(pos,n) //返回从pos开始的长度为n的一段
s1.erase(pos,n) //删除从pos开始的长度为n的一段


s=s1+s2;//将s2拼接到s1,然后赋值给s
sort(s.being(),s.end()) //将字符串中的每个字符按照字典序从小到大排序
reverse(s.begin(),s.end()) //翻转整个字符串
int k=stoi(s); //将一个字符串转成数字存到k之中

函数

基础格式
返回值 函数名(参数列表)
{
	函数体
}

返回值类型 一般为 void(空),bool,int,double,string

声明
int add(int a,int b,int c)
{
	int s=a+b+c;
	return s;
}

可以使用 add(x,y,z) 调用add函数,最后返回x+y+z的和

一般的函数调用是不会影响主函数的值的

当需要通过调用函数改变调用函数的多个值时,可以使用传递引用的方式

void chang(int  &x,int &y)
{
	int t=x;
	x=y;
	y=t;
}

//递归一般格式
int f(int x)
{
	if(x)//满足终止条件
	{
		//返回结果
	}
	(x..) //更改条件继续往下执行
}

位运算

a=10(1010) b=9(1001) 
a&b a和b转成二进制以后,对应位都是1才是1 
1010
1001
1000   a&b=8
a|b a和b转成二进制以后,对应位只要有一位是1就是1 
1010
1001
1011   a|b=11
a^b a和b转成二进制以后,对应位只要不相同即是1 
1010
1001
0011   a^b=3

for(int i=30;i>=0;i--)  //对int类型的非符号位从高位到低位进行枚举 
{
	if(x>>i&1) //x的二进制的第i位是1 
	{
		//
	}
}

//枚举n个人的不同选择
for(int i=0;i<1<<n;i++) //枚举每种选择 
{
	for(int j=n-1;j>=0;j--) //第i种选择的第j个人的状态 
	{
		if(i>>j&1) //第i种选择第j个人选了 
		{
			//
		}
		else        //第i种选择第j个人没有选 
		{
			//
		}
	}	
}

5 comments

  • 1