这几天在写省赛真题,难的题不会做,简单的做出来答案又不对,感觉很烦,还是心平气和地认真写吧,好多细节要注意
1.题目(超级重要)
第十届的第四个填空题不难,2019分解为3个数,但是我的答案一直有问题,后来看题
是分解为3个互不相同的数。会做的题一定要抓住。
解决:读题细致,看题的时候把重点写到纸上。
2.数据范围
蓝桥杯给出的样例一般都很简单,都算是特殊情况
一定要看下面的测试用例的规模和范围。
3.结果检查
往往写出来后就不管了,只用测试样例测试正确不代表完全正确,可以
自己试一下其他的样例,也可以在某些地方添加输出来观察运行过程。
5.小技巧
1》char a[100]; puts(a); 输出a
2》取后几位时,数据过大,防止溢出
(a+b)%c=(a%c+b%c)%c
(a*b)%c=(a%c*b%c)%c
3》数字拆解
stack<int> a;
while(n!=0)
{
a.push(n%10);
n=n/10;
}
4》进制转换
4.函数总结
0)3%10=3
1)sort()//排列
sort(a,a+n)//将数组a[n]从小到大排列
//若要从大到小排列
bool cmp(int a,int b)
{
return a>b;
}
sort(a,a+n,cmp);
//结构体比较大小 依然是从小到大排列
struct point{
int x;
int y;
};
bool cmp(point a,point b)
{
if(a.y<b.y) return true;
if(a.y==b.y&&a.x<b.x) return true;
return false;
}
----------------------
2)reverse()//将数组或字符串倒过来 --->algorithm
//数组
int a[10]={10,11,12,13,14,15};
reverse(a,a+4);
//字符串
string str="abcdefghi";
reverse(str.begin()+2,str.begin()+6);
------------------------------
3)next_permutation()//全排列 --->algorithm
int a[10]={4,9,2};
next_permutation(a,a+3);
do{
cout<<a[0]<<a[1]<<a[2]<<endl;
}while(next_permutation(a,a+3));
-----------------------------------
4)pow()//x的y次方 --->cmath
double pow(double X,int Y);
float pow(float X,float Y);
float pow(float X,int Y);
long double pow(long double X,long double Y);
long double pow(long double X,int Y);
//pow(int,int)是错的,可用pow((float)int,int),即将前一个int类型强制转换为float
--------------------------------
5)sqrt()//开根号 --->math.h
double sqrt(double x);
----------------
6)swap()//交换
7)取一个数的各个位上的数字
int a=n%10;//个位
int b=(n/10)%10;//十位
int c=(n/100)%10;//百位
//判断一个数中是否包含2,4
bool judge(int n)
{ int temp;
while(n){
temp=n%10;
if(temp==2||temp==4) return false;
n=n/10;
}
return true;
}
---------------------
8)求最大公因子
https://blog.csdn.net/weixin_30556161/article/details/94946629
int gcd(int a,int b)
{
int m=a>b?a:b;
int n=a<b?a:b;
while(m%n){
m=n;
n=m%n;
}
return m;
}
//递归
int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
//求n个数的最大公因子
int gcdN(int len)
{
if(len==1) return a[len-1];
else gcd(a[len-1],gcdN(len-1));
}//gcdN(len)返回前len个数的最大公因子
//求n个数的最大公因子就是求前n-1个数的最大公因子,与第n个数的最大公因子
------------------------
9)map --> include<map>
用map来查找数时间复杂度大幅度降低
https://blog.csdn.net/qq_38016957/article/details/88751842
https://www.cnblogs.com/yonglin1998/p/11780828.html
1》构造
map<string, int> stu;
2》插入
stu.insert(pair<string, int>("zhangsan",1));
stu["zhangsan"] = 1;
3》map的大小
Int nSize = stu.size();
4》迭代
map<string,int>::iterator iter;
for(iter=stu.begin();iter!=stu.end();iter++)
cout<<iter->first<<" "<<iter->second<<endl;
iter迭代器指向的数据类型是map<string,int>
iter->first输出map的key
iter->second输出map的value
5》查找
1)stu.count("zhangsan")
找到 返回1
没找到 返回0
2)用find函数来定位数据出现位置,它返回的一个迭代器,当数据出
现时,它返回数据所在位置的迭代器,如果map中没有要查找的数
据,它返回的迭代器等于end函数返回的迭代器
iter=stu.find("zhagnsan");
if(iter!=stu.end())
cout<<iter->first<<" "<<iter->second;
6》删除
iterator erase(iterator it);//通过一个条目对象删除
iterator erase(iterator first,iterator last)//删除一个范围
size_type erase(const Key&key);//通过关键字删除
stu.erase("zhangsan");
一些处理技巧
1.如果键值是一一对应的,当题目要求给键输出值,给值输出键的时候。
由于是一一对应的,所以不需要建2个map,直接在一个map里,
令map[键]=值,map[值]=键
2.如果键对应的是一串信息,比如 01 张三 男 23
可以直接将01 张三 男 23 或者 张三 男 23 看成字符串并当成值。
而不需要另外建一个结构体
----------------------------
10)队列的使用 -->include<queque>
循环报数游戏里,给定某个数,一旦报到这个数的倍数或报出的数字中含这个数
就淘汰。问最后谁赢。
这种问题最烦的就是爆出来的数和人编号的对应关系,用队列可以很好解决这种问题。
for(int i=1;i<=n;i++)
a.push(i);
while(n>1)
{
if(judge(flag)) { a.pop(); n--; }
else{ int tmp=a.front(); a.pop(); a.push(tmp);}
flag++;
}
//queue常用函数
queue<int> que;
que.push(2);//插入2到队列最末
que.pop();//吐出队首元素,无返回值
que.front();//返回队首元素
que.back();//返回队尾元素
que.size();//返回队列大小
que.empty();//是否为空,空则返回true
------------------------------------------------
11)常用字符处理函数
https://blog.csdn.net/qq_43309286/article/details/93191767
>string.h库函数
>https://www.runoob.com/cprogramming/c-standard-library-string-h.html
1》int strcmp(const char *str1,const char *str2)
str1==str2 0
str1>str2 >0
str2<str2 <0
2》char *strstr(const char *str1, const char *str2)
str1中包含str2 返回str2
不包含 返回null
3》char *strcpy(char *str2, const char *str1)
把str1复制到str2中
4》int strlen(const char *str)
返回str的长度
>string类
>https://blog.csdn.net/Krismile_/article/details/89765057
>string的最大长度2147483647
1》int compare(const string &s) const;
str1.compare(str2)
str1==str2 0
str1>str2 1
str1<str2 -1
2》string substr(int pos = 0,int n = npos) const
返回pos开始的n个字符组成的字符串
3》int find(char c, int pos = 0) const
int find(const string &s, int pos = 0) const
str1.find(str2)
str2是str1的子串 返回开始出现的位置
不是 返回4294967295
任何string的npos的值都是4294967295,
str1.npos==str2.npos=4294967295
4》注意
虽然可以通过str[1]='A';这种方法改变str
但是如果开始不先初始化,然后通过下标的方式置值,将输出为空
no: string str; str[0]='0'; str[1]='a'; str[2]='c';
yes: string str="abc"; str[0]='0'; str[1]='a'; str[2]='c';