写在前面: 这篇文章是我之前刷PAT(Basic Level)随手记下来的几个记忆点,希望对大家有所帮助。
1.字符串和数值类型之间的转换:
如果要将数值类型如int、double、long
转换为字符串string
,可以使用to_string()
函数
#include<string>
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
如果要将string
转换成int
输出,则使用stoi()
函数
#include<string>
int stoi (const string& str, size_t* idx = 0, int base = 10);
int stoi (const wstring& str, size_t* idx = 0, int base = 10);
如果要将string
转换成long int
输出,则使用stol()
函数,用法类似
如果要将string
转换成long long
输出,则使用stoll()
函数,用法类似
如果要将string
转换成float
输出,则使用stof()
函数,用法类似
如果要将string
转换成double
输出,则使用stod()
函数,用法类似
如果要将string
转换成long double
输出,则使用stold()
函数,用法类似
如果要将char
转换成int
输出,则使用atoi()
函数,用法类似
如果要将string
转换成char
输出,则使用c_str()
函数,如
s1.c_str1()
2.字符串长度:可以用strlen()
函数,返回在字符串中’\0’前面出现的字符个数,如:
#include<stdio.h>
#include<string.h>
int main()
{char str1[] = "abcdef";printf("%d\n", strlen(str1));return 0;
}
也可以用length()
和size()
函数
3.对vector v
或者string v
进⾏ sort 排序:
sort(v.begin(), v.end(), cmp1);
对数组a
进⾏sort排序:
sort(a, a + n, cmp1);
其中若要设置从大到小排序,则有:
bool cmp(int a,int b){return a>b;}
4.记录重复的数:如果碰见要记录递推过程中遇到的每一个数,情况类似PAT乙级1005,可以用vector
来读取及处理数据,另设一组数组
来标记数据
5.判断素数的程序:对于数字a,i从2到根号a,如果a能够被其中一个i整除,说明i不是素数,return false,否则说明a是素数return true
bool isprime(int a)
{for (int i = 2; i * i <= a; i++)if (a % i == 0) return false;return true;
}
6.倒置数组或者vector中的元素:可以用reverse()
函数
#include <algorithm>
reverse(str.begin(),str.end()) //反转字符串
reverse(vector.begin(),vector.end()) //反转向量
reverse(a,a+strlen(a)) //反转数组
7.倒置数组操作:数组长度为n,要想把数组循环右移m位,只需要先将整个数组a倒置,再将数组前m位倒置,最后将数组后n-m位倒置即可完成循环右移m位
8.将一串字符颠倒输出:可以用stack
将输入的每个单词或者字符s都分别v.push(s)压入栈中,再输出栈顶v.top(),然后将栈顶元素弹出v.pop(),直到栈空为止
#include<iostream>
#include<stack>
using namespace std;int main()
{string s;stack<string> v;while(cin>>s) v.push(s);cout<<v.top();v.pop();while(!v.empty()){cout<<" "<<v.top();v.pop();}return 0;
}
9.一元多项式求导:
- flag用来判断是否已经有过输出~
- 当b!=0时,因为给出的是所有非零项系数,所以必定会有输出,先判断flag是否为1,如果为1表示已经有过输出,那么在前面要先输出一个空格
- 输出 a * b 和 b – 1,然后将flag标记为1表示已经有过输出
- 最后判断当没有输出并且b==0的时候,输出“0 0”
10.三目运算符:b?x:y
先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。一个条件表达式绝不会既计算x,又计算y。
条件运算符是右结合的,也就是说,从右向左分组计算。例如,a ? b : c ? d : e
将按a ? b : (c ? d : e)
执行。加括号()是为了方便阅读,不加也是一样的。
11.分类存储数据可以用vector
,同一类数据存储在同一个vector[i]中,读取时用vector[i][j]
12.按照规定格式输入:如果输入格式中,数据与数据之间有其他字符,可以用scanf语句,
13.输出数字空余数位用0补齐:如printf("%02d",i)
,意思是用0补齐,一共2位,可以用其他数字代替。
14.按照规定格式输出:如果输出格式中,数据与数据之间有其他字符,可以用printf语句,如:printf("%02d:%02d", m, pos);
15.判断某个字符型是否为数字或字母:
#include<cctype>
isdigit(char c or string c);
isalpha(char c or string c);
16.substr 只有两种⽤法:
string s2 = s.substr(4); // 表示从下标4开始⼀直到结束
string s3 = s.substr(5, 3); // 表示从下标5开始,3个字符
17.类似日期的字符串比较:如果要比较如"YYYY/MM/DD"这样形式的日期,可以直接比较字符串
cin>>name>>birth;
if(birth>="1814/09/06"&&birth<="2014/09/06")
{cnt++;if(birth>=maxbirth){maxbirth=birth;maxname=name;}if(birth<=minbirth){minbirth=birth;minname=name;}
}
18.find函数:
第一种,algorithm
头文件的find()。
使用方法:find(begin,end,value)
,一般用 容器.end()
来判断查找成功与否。左闭右开。
begin
是容器或者数组的起始地址(容器.begin()或者数组名),也可以是任意地址,不非法即可;
end
是结束查找的地址(容器.end()或者数组名+长度),
value
是想要查找的字符或者字符串,
查找成功将返回迭代器(容器)或者指针(数组),否则返回end()
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{vector<int> v;for(int i=0;i<5;i++){v.push_back(i);}if(find(v.begin(),v.end(),4)!=v.end()){ printf("找到的下标为%d\n",find(v.begin(),v.end(),4)-v.begin()); //获取元素的下标 }else{printf("该元素不存在\n");}return 0;
}
第二种,string
自带的find(),可查找指定字符串和指定字符。
使用方法:如在string1中查找string2,string1.find(string2)
;返回值为string2第一次在string1中出现的位置。
若希望在特定位置开始查找,可使用 string1.find(string2,location)
;
如果找不到,则返回值为string::npos
,即对于string,通过a.find(val)==string::npos
来做判断是否查找成功
#include<iostream>
#include<string>
using namespace std;
int main()
{string s1,s2;s1 = "hello world";s2 = "world";if(s1.find(s2)!=string::npos){ //查找字符串 printf("s2在s1中的起始下标为%d\n",s1.find(s2)); }else{printf("s1中不存在s2字符串"); } char c = 'e';if(s1.find(c)!=string::npos){ //查找字符 printf("字符c在s1中的起始下标为%d\n",s1.find(c)); }else{printf("s1中不存在字符c"); } return 0;
}
19.string::npos:string::npos是一个静态成员常量,表示size_t的最大值(Maximum value for size_t)。该值表示“直到字符串结尾”,作为返回值它通常被用作表明没有匹配。
20.大小写字母转换:小写换大写用toupper()
,大写换小写用tolower()
,头文件为 < cctype >。
21.四舍五入:
int t = N / 2 + N % 2;
22.数组下标:C++的数组下标可以是字符,存储的是ASCII码的值
23.截取字符串:
string s = "0123456789";
string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789"
string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = "567"
24.把字符串中的字母转化为数字
将字符减去’A’再加1,此时返回的是该字母在1-26里的序号
s[i]=(s[i]-'A'+1);
25.把字符串中的数字转化为数字
将字符减去’0’即可
26.取整
floor向下取整
ceil向上取整
round四舍五入
#include <iostream>
#include <math.h>
using namespace std;int main()
{cout<<floor(4.4)<<endl;//4cout<<floor(4.5)<<endl;//4cout<<ceil(4.4)<<endl;//5cout<<ceil(4.5)<<endl;//5cout<<round(4.4)<<endl;//4cout<<round(4.5)<<endl;//5double a;//当a是正数也可以while(cin>>a)cout<<(int)(a+0.5)<<endl;return 0;
}