完成√ 102【入门3】循环结构
P1075 [NOIP2012 普及组] 质因数分解
因为已知 正整数 n 是 两个不同的质数 的乘积
所以从最小的数开始循环 之后再除以这个小的数 得出那个大的质数即可了、、
P1009 [NOIP1998 普及组] 阶乘之和
首先要学会高精度加法、乘法:高精度算法,高精度加法,高精度减法,高精度乘法,高精度除法,信息学奥赛算法,C++算法_哔哩哔哩_bilibili
以下是大佬的题解,和视频里的方法有点区别:
#include<iostream> #include<cstdio> using namespace std; int n,a[101]={0},s[101]={0}; //高精求积 void change(int x) { int g=0; for(int i=100;i>=0;i--) { a[i]=a[i]*x+g; g=a[i]/10; a[i]=a[i]%10; } } //高精求和 void qh() { int g=0; for(int i=100;i>=0;i--) { s[i]=s[i]+a[i]+g; g=s[i]/10; s[i]=s[i]%10; } } //查看最终结果在数组中的位置 void sc() { int w; for(int i=0;i<=100;i++) { if(s[i]!=0) { w=i; break; } } //打印 for(int i=w;i<=100;i++) printf("%d",s[i]); } int main() { scanf("%d",&n); s[100]=a[100]=1; for(int i=2;i<=n;i++) { change(i); qh(); } sc(); return 0; }
P1217 [USACO1.5] 回文质数 Prime Palindromes
这题我直接进行一个表的打(//#include<bits/stdc++.h> using namespace std; //判断回文 123?=321 bool isp(int i) { int x = 0, s = i; while (i != 0) { x = x * 10 + i % 10; i /= 10; } if (x == s) { return true; } else { return false; } } //判断质数 bool isz(int i) { int j = 0; for (j = 2; j <= sqrt(i); j++) { if (i % j == 0) { break; } } if (j > sqrt(i)) { return true; } else { return false; } } int main() { int a, b; cin >> a >> b; //若a为偶数+1取奇数 if (a % 2 == 0)a++; //偶数位数的回文数能被11整除 if (b >= 10000000) { b = 9999999; } for (int i = a; i <= b; i = i + 2)//i可以每次+2来取奇数 { if (isp(i) && isz(i)) { cout << i << endl; } } }
- 判断回文 可以通过数字反转 123?=321
- 判断质数
- 偶数位数的回文数能被11整除
SQL注入
1.涉及函数
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符
mysql_escape_string() 转义一个字符串
2.原理
先了解一下什么是窄、宽字节已经常见宽字节编码:
-
当某字符的大小为一个字节时,称其字符为窄字节.
-
当某字符的大小为两个字节时,称其字符为宽字节.
-
所有英文默认占一个字节,汉字占两个字节
-
常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等
为什么会产生宽字节注入,其中就涉及到编码格式的问题了,宽字节注入主要是源于程序员设置数据库编码与PHP编码设置为不同的两个编码格式从而导致产生宽字节注入。
如果数据库使用的的是GBK编码而PHP编码为UTF8就可能出现注入问题,原因是程序员为了防止SQL注入,就会调用我们上面所介绍的几种函数,将单引号或双引号进行转义操作,转义无非便是在单或双引号前加上斜杠(\)进行转义 ,但这样并非安全,因为数据库使用的是宽字节编码,两个连在一起的字符会被当做是一个汉字,而在PHP使用的UTF8编码则认为是两个独立的字符,如果我们在单或双引号前添加一个字符,使其和斜杠(\)组合被当作一个汉字,从而保留单或双引号,使其发挥应用的作用。但添加的字符的Ascii要大于128,两个字符才能组合成汉字 ,因为前一个ascii码要大于128,才到汉字的范围 ,这一点需要注意。
SQL语句
SELECT column1, column2, ... FROM table_name;/ SELECT * FROM table_name; SELECT DISTINCT column1, column2, ... FROM table_name;(DISTINCT 关键词用于返回唯一不同的值) SELECT column1, column2, ... FROM table_name WHERE condition;(WHERE详细用法SQL WHERE 子句 | 菜鸟教程)AND & OR 运算符(例SELECT * FROM Websites WHERE alexa > 15 AND (country='CN' OR country='USA');)
SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC(默认)|DESC; (column1, column2, ...:要排序的字段名称,可以为多个字段。 ASC:表示按升序排序。 DESC:表示按降序排序。) INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);/ 没有指定要插入数据的列名的形式需要列出插入行的每一列数据: INSERT INTO table_name VALUES (value1,value2,value3,...); UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition; DELETE FROM table_name WHERE condition;SELECT column_name(s) FROM table1
UNION (ALL)
SELECT column_name(s) FROM table2;注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
3.一般流程:
Mysql 有一个系统数据库 information_schema,存储着所有的数据库的相关信息,一般的, 我们利用该表可以进行一次完整的注入。以下为一般的流程。
- 猜数据库 select schema_name from information_schema.schemata
- 猜某库的数据表 select table_name from information_schema.tables where table_schema=’xxxxx’
- 猜某表的所有列 Select column_name from information_schema.columns where table_name=’xxxxx’
- 获取某列的内容 Select *** from ***