输入输出
程序框架(头文件)
#include <bits/stdc++.h>
using namespace std;
int main(){
//此中间空白部分是你编写代码的地方;
//使用双斜杠代表注释,及双斜杠后面的内容不运行
return 0;
}注意:程序中出现的括号,类似于尖括号,小括号,大括号,都是成对出现的。
cout输出 和 cin输入
cout
使用格式:
cout <<
cout<<"Hello,World!"<<endl;
cout<<"Hello,World!"<<'\n'; // ‘\n’ 和 endl 都表示换行
cout<<"Hello"<<','<<"World"<<'!'<<endl;//也可以使用串联输出多个内容
int a = 1, b = 2, c = 3;
cout << a << b << c;注意:cout输出语句,必须要链接输出符号 << 使用,如果要连续输出多个数据,都需要用 << 连接起来;
比如可以这样:cout << n << a << c << endl;
对齐输出
setw( )函数:可以控制输出流的下一个输出内容的场宽为括号里的参数,当下一个输出的内容的宽度不足设置的参数时,自动在内容前面添加字符(默认为空格)来补齐宽度。如cout << setw(10) << a ;仅对下一个输出内容有效。left和right修饰符:left使输出内容左对齐,right使输出内容右对齐,可结合setw( )函数使用,如cout << left << setw(10) << a ;setfill( )函数:设置补齐宽度时,指定用什么字符(而不使用默认的空格)。
如: cout << setfill(‘*’) << setw(10) << a << setw(9) << b ; 它将对设置后的所有输出内容有效。
cin
使用格式:cin >>
int n,a,b;
cin >> n >> a >> b;注:必须要使用 >> 连接符跟在 cin 后面,再往后连接要输入(读入)的内容;
输入输出加速(cin 和 cout)
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
//先加这两行代码,再正常编写其他代码
return 0;
}文件输入输出(文件读写提交方式)
#include <bits/stdc++.h>
using namespace std;
int main(){
freopen("题目英文名.in", "r", stdin);
freopen("题目英文名.out", "w", stdout);
//编写调试好程序,准备提交之前,在int main 下面的第一行,先增加这两行代码
return 0;
}注释:题目英文名在正式比赛中在试卷第一页就会有,在 OJ 上一般标题下面会有个“文件 IO” 的英文名称
数据类型与变量
变量的含义
变量,可以理解为“可以变化的量”,它就像是一个可被命名的容器,核心作用是存储和管理数据。
和数学中的变量不太一样,在编程中,需要用到变量,首先就必须得先创建一个变量。
即:先创建,再使用。
变量的创建
变量创建的格式:数据类型+变量名字; 为了方便观看,用+号代表了空格,实际编写代码时一定要写空格,而没有+号,如下:
int a;
int b = 0;
int c = 1,d = 2,e = 3; //= 代表赋值语句,意思是 将 = 后面的值,赋值给前面的变量;变量的命名规则
只能字母或下划线开头,不能是数字开头
只能包含字母、数字、下划线
不能是 C++中的关键字
变量的命名是为了方便编写程序者快速使用变量,所以起名通常遵循“见名知意”的原则。
变量的赋值
在c++编程中等号
=代表赋值,如a = 6;代表把 6 赋值给变量 a,之后变量 a 里面存的值就是 6;接下来可以再a=3;此时变量 a 里面存的值就变成 3 了。变量可参与运算:
a = 10 ; a = a - 6;
a=1 ;代表把 10 赋值给变量 a,此时变量 a 的值为10;
a=a-6;表示把变量 a 里面的值减去 6,得到的结果重新赋值回给变量 a;此时变量 a 的值就变成了 4;
可以通过以下代码查看一下变量值的变化过程:
int a; // 创建一个用于储存 int 类型的变量,名字为 a
a = 10; //给 a 赋值为 10;
cout << a << '\n' ; //第一次输出 a 的值
a = a - 6;
cout << a << '\n' ; //第二次输出 a 的值常用数据类型
注:强制转换数据类型,可以使用(新的数据类型)+要转换的变量;
比如:double ave = (double)10 / 3;
字符类型
'a':单引号括起来的属于字符'3':字符'\n':这个表示换行,这类含有反斜杠'\'的属于转义字符,如'\0','\t'"hello,world":字符串"a":只要是双引号括起来的,即使一个字符也是字符串"":双引号括起来的空串,也是字符串
ASCII码(信息交换标准代码)
在计算机中,所有的数据在存储和运算时都要使用二进制数表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是就有了统一使用标准,上述常用符号具体用哪些二进制数来表示。具体可以百度查看ascii码对照表。
'0' ~ '9'对应的 ASCII 为48 ~ 57'A' ~ 'Z'对应的 ASCII 为65 ~ 90'a' ~ 'z'对应的 ASCII 为97 ~ 122
基础二进制
二进制即要求满二进一,因此每一位为 0 或 1
二进制从最低位到最高位,数位的权值分别为:20 , 21 , 22 , 23 , … 即 1, 2, 4, 8, 16, 32, 64, 128, …
原码、反码、补码
原码
最高位为符号位,正数为 0,负数为 1。
剩下位置为原数绝对值的二进制。
反码
正数反码与原码一致。
负数反码除最高位之外,在原码基础上取反。
补码
正数补码与原码一致
负数补码在反码基础上加 1。
字符与整数转换
int a;
char c; //定义两个类型的变量数字字符转换为对应整数:
(int)(c - '0')数字转换为对应字符:
(char)(a + '0')大写字母映射到 0 ∼ 25:
(int)(c - 'A')小写字母映射到 0 ∼ 25:
(int)(c - 'a')大写转小写:
(char)(c - 'A' + 'a')小写转大写:
(char)(c - 'a' + 'A')
内存大小换算
bit:位(1个二进制位),计算机储存的最小单位
Byte:字节(8个连续的二进制位),计算机储存的基本单位
换算方法
1 B(Byte) = 8 bits
1 KB(KiB) = 1024 B(210 B)
1 MB(MiB) = 1024 KB
1 GB(GiB) = 1024 MB
1 TB(TiB) = 1024 GB
1 PB(PiB) = 1024 TB
基础运算
数学运算符
+、-、*、/、%: 加法、减法、乘法、除法、取余/取模(): 数学中的小括号、中括号、大括号在 C++ 中全都用小括号表示整数和整数进行运算,结果也会是整数(除法会变成得到商)
只要有一个运算数是小数(浮点数),运算结果就会得到小数类型
取余运算只能在整数间进行,不能对小数取余运算!不能除以0或对0取余!
保留小数位
保留小数位,可使用
cout<<fixed<<setprecision(y);表示保留y位小数位。上述的这种方式和我们直观理解中的四舍五入稍有差别,对于 4 舍和 6 入的部分是没有问题的,对于舍入位是5,不同情形会出现不同的结果。
一般题目的对比结果都会用精度控制,比如相对或绝对误差在 10−6(即 0.000001)以内就算对,此时保留 7 位小数就可以。
浮点数取整
floor()函数向下取整:每个数可以被取整为不超过它的最大的的整数。例如:floor(2.6) = 2; floor(-2.6) = -3;ceil() 函数向上取整:每个数可以被取整为不小于它的最小整数。例如:ceil(2.3) = 3; ceil(-2.6) = -2;
round()函数四舍五入取整:首先舍入后的符号不变。然后考虑|x|,如果它的小数点后一位在0-4之间,会被直接舍去;而在5-9之间则会进位。例如:round(3.49) = 3; round(3.50) = 4; round(-3.6) = -4; round(-3.4) = -3;
赋值语句
C++中的单个等号 = 代表赋值。如 a = 3 ; 表示将数值 3赋值给变量 a ,即 a 的值变为 3 。
再如 变量 a = 表达式 ;表示的意思是:先计算 = 的右边表达式的值,然后再把得到的值存入(赋值给)左边的变量。
注:整个赋值语句的值为赋值后值,因此可以写 a = b = c = 0; 这样的连续赋值语句(但不推荐)。
赋值基本语法
a += b;-->a = a + b;a -= b;-->a = a - b;a *= b;-->a = a * b;a /= b;-->a = a / b;a %= b;-->a = a % b;a++;~ 将a增加 1;作为表达式时,值为增加之前的值;a--;同理;++a;~ 将a增加 1;作为表达式时,值为增加之后的值;--a;同理;
随机数生成
srand( time( 0 ) ); 使用当前时间使随机数发生器随机化;使用 rand() 函数生成范围内的随机数,总结如下(a,b均小于等于RAND_MAX):
[a,b] :
(rand() % (b - a + 1)) + a;(a,b) :
(rand() % (b - a + 1)) + a - 1;[a,b) :
(rand() % (b - a)) + a;(a,b] :
(rand() % (b - a)) + a + 1;
注:使用随机数生成范围时,要确保 a 和 b 的取值合理,避免出现不符合预期的结果。
选择语句(选择/分支结构)
关键词
if:如果else:否则
语法格式
最基础的判断语法,可以没有否则的语句
if( 条件表达式 ){
//条件满足则执行此语句;
}判断语句带分支的判断,表达式为真/假时执行不同的判断
if( 条件表达式 ){
//条件满足,则执行语句 1;
}else{
//否则,执行语句 2;
}多个条件依次判断,选择执行其中一条。下面的代码可以继续并列更多
else if。
if (条件表达式 1){
//表达式 1 满足,则执行的内容;
} else if (条件表达式 2){
//表达式 1 不满足,并且条件表达式 2 满足时,执行的内容
}else{
//表达式 1 不满足,并且条件表达式 2 也不满足时,执行的内容
}关系运算符
>: 大于<: 小于==: 等于!=: 不等于<=: 小于等于>=: 大于等于
关系运算符用于比较两个值之间的关系,其结果为布尔类型(真或假)。
逻辑运算符
位运算符
位运算直接操作整数在内存中的二进制位(0和1),仅适用于整型(如int、char)和字符型数据。
其核心优势在于执行效率高。所有运算符均按二进制位逐位操作,具体如下:
布尔类型与逻辑运算
C++ 中可以使用
bool布尔类型储存真true与假false。当
bool类型参与运算时,真与假会分别对应到 1 与 0。数值类型转换到布尔类型时,0 为假,其他值都为真
布尔逻辑运算如下:
常见选择语句中的逻辑判断
三个数找最大数
一个数比其他两个数都大。
a > b && a > c
注意:千万不要不要不要写成a>b>c 错误的!!
闰年判断
普通闰年:
y % 4 == 0 && y % 100 != 0世纪闰年:
y % 400 == 0闰年判断:
(y % 4 == 0 && y % 100 != 0) || y % 400 == 0因为
&&优先级高于||,所以不写那个小括号也可以。
构成三角形判断
任意两边之和大于第三边。
a + b > c && a + c > b && b + c > a
上下取整判断
int p, q, x;,这里我们只讨论p,q > 0的情况。
下取整()
x = p / q;
上取整()
第一种方式:
if (p % q == 0){
x = p / q;
}else{
x = p / q + 1;
}第二种方式:
x = (p + (q - 1)) / q;第三种方式:
x = p / q + (p % q != 0);
是否为小数判断
int p, q, x;,这里我们只讨论p,q > 0的情况。
double l=1.0*p/q;
x=l;
if(x==l){
cout<<"除的结果是整数";
}else{
cout<<"除的结果是小数";
}x=p/q;
if(x*q==p){
cout<<"除的结果是整数";
}else{
cout<<"除的结果是小数";
}循环语句(循环结构)
for循环语句
for循环语法
⭐
for(变量初始值;进入循环的条件;变量的变化){
此处是循环的内容;
}
for(int i=1;i<=10;i++){ //设置变量i的值为1;当i小于等于10就进循环;执行一次循环后i增加1
cout<<i<<endl; //进循环执行一次输出i的值,并换行;
}while循环语句
⭐
while(进入循环的条件){
此处是循环的内容;
}
int i=1;
while(i<=10){ //当i小于等于10就进循环;
cout<<i<<endl; //进循环执行一次输出i的值,并换行;
}注:以上两种循环的语句,可进行总结:for循环一般更加适用于已知循环次数的情况。而while循环更加适用于未知循环次数,但知道什么时候执行循环(即,满足条件就一直执行)的情况。但总体上二者循环语句一模一样,可以互相转换。
高级控制
break;立刻结束当前所在的循环continue;立刻跳过本次所在的循环,并进行下一次循环return 0;结束整个主函数程序
break语句
for (int i = 1; i <= 5; i++){
cout << i;
if (i == 3){
break;
}
cout << i;
}上面代码输出: 11223
continue语句
for (int i = 1; i <= 5; i++){
cout << i;
if (i == 3){
continue;
}
cout << i;
}上面代码输出: 112234455
常见循环语句逻辑表达
输出 1~n 之间的所有整数
int n;
cin>>n;
for(int i = 1; i <= n; i++){
cout << i << '\n';
}上图为:输出1到100,for循环的运行过程顺序。
求n个数的和
int n, x, ans;
cin >> n;
ans = 0;
for (int i = 1; i <= n; i++){
cin >> x;
ans += x;
}
cout << ans << "\n";求最值(最大最小值)
//例:求n个数中的最大值(所有数字均不大于1000)
int n, x, ans;
cin >> n;
ans = 0;
for (int i = 0; i < n; i++){
cin >> x;
if (x > ans){
ans = x;
}
}
cout << ans << "\n";//例:求n个数中的最小值(所有数字均不大于1000)
int n, x, ans;
cin >> n;
ans = 1001;
for (int i = 1; i <= n; i++){
cin >> x;
ans = min(ans, x);
}
cout << ans << "\n";统计偶数的个数
int n, x, cnt;
cin >> n;
cnt = 0;
for (int i = 1; i <= n; i++){
cin >> x;
if (x % 2 == 0){
cnt++;
}
}
cout << cnt << "\n";拆位(短除法)
% 10:得到个位上的数/ 10:去掉个位后的数个位:
a % 10十位:
a / 10 % 10百位:
a / 100 % 10千位:
a / 1000 % 10
int x;
cin >> x;
while (x > 0){ //短除法拆位
cout << x % 10 << ",";
x /= 10;
}int x;
cin >> x;
for (int i = x; i > 0; i /= 10){ //短除法拆位
cout << i % 10 << ' ';
}判质数
int n;
cin >> n;
bool flag = ture; // 一开始假设n是质数
if (n <= 1){ // 不是大于1的自然数一定不可能是质数
flag = false;
}
for (int i = 2; i <= n - 1; i++){ // 除了 1 和它本身以外(2 ~ 本身-1)
if (n % i == 0){ // 如有其他因数,则不是质数
flag = false;
}
}
if (flag == true){ //根据 flag 的值,可以判断 n 是否是质数
cout << "是质数";
}else{
cout << "不是质数";
}