【入门3】循环结构
P1009 [NOIP1998 普及组] 阶乘之和
高精度加法和乘法
P1980 [NOIP2013 普及组] 计数问题
我的思路是找出每一个数的每一位并判断是否为x。
因此我参考了如何判断一个数的位数的代码:
int judge(int num) { int count = 1; while (num / 10) { count++; num /= 10; } return count; }
此代码是已经默认输入的数至少为一位数因此从两位数开始判断(while(num / 10))
也就是说一位数是无法进入循环的,而我们在题中是需要在循环中判断一位数(是否为x),所以我进行了改进写出了第一版题解:
#include<bits/stdc++.h> using namespace std; int main() { int n,x,c=0; int t; cin >> n>>x; for (int i = 1; i <= n; i++) { t = i; while (i % 10 != 0||i/10) { if (i % 10 == x) { c++; } i /= 10; } i = t; } cout << c << endl; }
即在循环条件中加入 i % 10 != 0 把一位数也纳入循环判断中。
但其实在这题中已经限定了n为正整数,因此循环条件为 i>0 即可 即第二版:
#include<bits/stdc++.h> using namespace std; int main() { int n,x,c=0; int t; cin >> n>>x; for (int i = 1; i <= n; i++) { t = i; while (i > 0) { if (i % 10 == x) { c++; } i /= 10; } i = t; } cout << c << endl; }
此外又联想到:参考的代码能判断负数的位数,那么我的第一版题解能否解决n为负数的情况呢?尝试过后发现我这个思路的题解并不能解决n为负数的情况。
又联想到:如何将参考代码改成从一位数开始判断,解决如下:
#include<bits/stdc++.h> using namespace std; int main() { int num; cin >> num; int count = 0; while (num % 10 != 0 || num / 10) { count++; num /= 10; } cout<<count; }
即也是在循环条件中加入 i % 10 != 0 把一位数也纳入循环判断中。
P5723【深基4.例13】质数口袋
这题重点解决解决判断素数,方法之一:
在2到sqrt(n)之间任取一个数,如果n能被整除则不是素数,否则就是素数
#include<stdio.h> #include <math.h> int main() { int i,j,n; printf("Please input numbers: "); scanf("%d",&n); j=(int)sqrt(n); for(i=2;i<=j;i++) { if(n%i==0) { break; } } if(j<i) { printf("%d is prime!\n",n); } else { printf("%d is not prime!\n",n); } return 0; }
有关CTF
在CTF中主要包含以下5个大类的题目,有些比赛会根据自己的侧重点单独添加某个分类,例如`移动设备(Mobile)`, `电子取证(Forensics)`等,近年来也会出来混合类型的题目,例如在Web中存在一个二进制程序,需要选手先利用Web的漏洞获取到二进制程序,之后通过逆向或是Pwn等方式获得最终flag
### Web
Web类题目大部分情况下和网、Web、HTTP等相关技能有关。主要考察选手对于Web攻防的一些知识技巧。诸如`SQL注入`、`XSS`、`代码执行`、`代码审计`等等都是很常见的考点。一般情况下Web题目只会给出一个能够访问的URL。部分题目会给出附件
### Pwn
Pwn类题目重点考察选手对于`二进制漏洞的挖掘和利用`能力,其考点也通常在`堆栈溢出`、`格式化漏洞`、`UAF`、`Double Free`等常见二进制漏洞上。选手需要根据题目中给出的二进制可执行文件进行逆向分析,找出其中的漏洞并进行利用,编写对应的漏洞攻击脚本(`Exploit`),进而对主办方给出的远程服务器进行攻击并获取flag通常来说Pwn类题目给出的远程服务器信息为`nc IP_ADDRESS PORT`,例如`nc 1.2.3.4 4567`这种形式,表示在`1.2.3.4`这个IP的`4567`端口上运行了该题目
### Reverse
Re类题目考察选手`逆向工程`能力。题目会给出一个可执行二进制文件,有些时候也可能是Android的APK安装包。选手需要逆向给出的程序,分析其程序工作原理。最终根据程序行为等获得flag
### Crypto
Crypto类题目考察选手对`密码学`相关知识的了解程度,诸如`RSA`、`AES`、`DES`等都是密码学题目的常客。有些时候也会给出一个加密脚本和密文,根据加密流程逆推出明文。
### Misc
Misc意为杂项,即不包含在以上分类的题目都会放到这个分类。题目会给出一个附件。选手下载该附件进行分析,最终得出flag
常见的题型有图片隐写、视频隐写、文档隐写、流量分析、协议分析、游戏、IoT相关等等。五花八门,种类繁多。
【计算机网络】HTTP 协议详解 学习✔
HTTP 协议的工作过程
- 客户端: 主动发起网络请求的一端
- 服务器: 被动接收网络请求的一端
- 请求: 客户端给服务器发送的数据
- 响应: 服务器给客户端返回的数据
HTTP 协议的重要特点: 一发一收,一问一答
注意: 网络编程中,除了一发一收之外,还有其它的模式
- 多发一收:例如上传大文件
- 一发多收:例如看直播时,搜索一个词条可以得到多个视频源
- 多发多收:例如串流(steam link、moonlight 等等)
HTTP 协议格式总览
HTTP 请求格式:
HTTP 响应格式:
注意: 为什么 HTTP 报文中要存在空行呢?
- 因为 HTTP 协议并没有规定报头部分的键值对有多少个,使用空行就相当于是报文的结束标记或报文和正文之间的分隔符
- HTTP 在传输层依赖 TCP 协议,TCP 是面向字节流的。如果没有这个空行,就会出现”粘包问题“
请求“报头”(header)
header 的整体格式是键值对结构,每个键值对占一行,键和值之间使用 冒号+空格
进行分割
Host
HOST 的值表示服务器主机的地址和端口(地址可以是域名,也可以是 IP;端口号可以省略或者手动指定)
Content-Length
Content-Length 表示 body 的数据长度,长度单位是字节
Content-Type
Content-Type 表示 body 的数据格式,以下介绍三种请求中的数据格式
User-Agent(简称 UA)
User-Agent 表示浏览器或者操作系统的属性
Referer
Referer 表示这个页面是从哪个页面跳转过来的,这是一个很有用的字段
Cookie
Cookie 是浏览器提供的一种让程序员在本地存储数据的能力
状态码
200 OK
表示访问成功
404 Not Found
表示没有找到资源
(当你发送请求的 URL 在服务器中找不到该资源,就会出现 404)
403 Forbidden
表示访问被拒绝
(有的页面通常需要用户有一定的权限才能访问,如未登录)
405 Method Not Allowed
表示访问的服务器不能支持请求中的方法或者不能使用该请求中的方法
500 Internal Server Error
表示服务器出现内部错误
(一般是服务器的代码执行过程中遇到了一些特殊的情况,造成服务器崩溃可能会产生这个状态码)
504 Gateway Timeout
表示当前服务器负载比较大,服务器处理单条请求的时耗很长,就会出现超时情况
302 Move temporarily
表示临时重定向
(重定向相当于手机呼号的呼叫转移功能,如果我们换了一个手机号,就可以去办理该呼叫转移业务,使朋友拨打你的旧号码时,自动跳转到新号码)
301 Moved Permanently
表示永久重定向,当浏览器收到这种响应时,后续的请求都会被自动改成新的地址