PAT编程基础笔记

写在前面: 这篇文章是我之前刷PAT(Basic Level)随手记下来的几个记忆点,希望对大家有所帮助。

1.字符串和数值类型之间的转换

如果要将数值类型如int、double、long转换为字符串string,可以使用to_string()函数

#include
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
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
#include
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 
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
#include
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.一元多项式求导

  1. flag用来判断是否已经有过输出~
  2. 当b!=0时,因为给出的是所有非零项系数,所以必定会有输出,先判断flag是否为1,如果为1表示已经有过输出,那么在前面要先输出一个空格
  3. 输出 a * b 和 b – 1,然后将flag标记为1表示已经有过输出
  4. 最后判断当没有输出并且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
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
#include
#include
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
#include
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 
#include 
using namespace std;

int main()
{
    cout<<floor(4.4)<<endl;//4
    cout<<floor(4.5)<<endl;//4
    cout<<ceil(4.4)<<endl;//5
    cout<<ceil(4.5)<<endl;//5
    cout<<round(4.4)<<endl;//4
    cout<<round(4.5)<<endl;//5

    double a;//当a是正数也可以
    while(cin>>a)
    cout<<(int)(a+0.5)<<endl;
    return 0;
}

你可能感兴趣的:(C/C++,算法,c++,数据结构)