PTA及杭电OJ2000-2099题笔记

本文总结了C++编程中的注意事项,包括数学运算、字符串操作、输入处理、数组和vector使用、排序算法、进制转换、几何问题、GPA计算等,帮助读者提升编程技能并解决常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意点总结

一、分母是一个式子时很容易写成n/a-b,应该是n/(a-b)
二、初始化问题,while循环内部要记得初始化:vector数组 .clear();
在这里插入图片描述
三、注意忽略换行符
cin.ignore(); // 忽略换行符 典型题OJ2017
在这里插入图片描述
四、数组作为参数放入函数中
void count(string s,vector nums) 这种参数不加&不会对main主函数中的nums进行修改
在这里插入图片描述
五、3/4得到的是整数,OJ2002
六、compare 函数
bool compare(char a, char b) {
return a < b; }由小到大。由大到小是return a>b

知识点总结

OJ网站不支持万能头文件

字符串常用方法

涉及题目OJ2054
s.find()//找到返回第一次出现位置,找不到返回-1
s.substr(起始下标,(子串长度)) 返回子串

字符串读取方法

在这里插入图片描述

头文件万能

#include <bits/stdc++.h>
数学类的# include <math.h>

输出格式问题

头一个不加空格后面都加空格

bool first=true;
for(int i=n-m;i<n;i++){
if(first){
first=false;
cout<<nums[i];
}else {
cout<<" "<<nums[i];
}

x和y都为0时结束输出

while(cin>>x>>y,x||y) //x和y都等于0时结束即为false

PAT

1005题将vector数组从大到小排序和从小到大排序

sort(name.rbegin(),name.rend());
sort(name.begin(),name.end());

1008题 数组右移动

注意 n,m其中m可能大于n,所以m=m%n;

1012题精确到小数点后多少位如何实现?

对于C语言来说,精确到小数点后几位可以用以下代码实现:
printf(“%.nf”,number);

OJ2000题

一、对于处理输入数据有多组,每组占一行,有三个字符组成,之间无空格。这类问题通常采用
while(scanf()!=EOF)
while (cin>>nums)//注意这里nums可以为数组
二、sort函数只能对vector数组进行排序
且如果需要对char数组排序,需要重新定义compare函数
bool compare(char a, char b) {
return a < b; }// 按字符的大小排序
三、如果初始化vector 数组为vector v(3)那么数组中前三个位置为0
v.push_back是在这后面添

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

// 比较函数
bool compare(char a, char b) {
return a < b; // 按字符的大小排序
}

int main(int argc, char** argv) {
	vector <char> v(3);//定义数组是为了sort函数,它只能给数组排序 
	char nums[3];
	while(cin>>nums){
		for(int i=0;i<3;i++){
		v[i]=nums[i];
	}
	sort(v.begin(),v.end(),compare);
	cout<<v[0]<<" "<<v[1]<<" "<<v[2]; 
	}
	return 0;
}

OJ2001题

sqrt开平方

#include <iostream>
#include <algorithm>
#include<cmath>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	double x1,y1,x2,y2;
	double res;
	while (cin>>x1>>y1>>x2>>y2) {
		res=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
		printf("%.2f",res);
		cout<<endl;
	}
	return 0;
}

OJ 2002 球体积

注意点:4/3相除会得到整数结果,如果要得到浮点数结果需要写成4.0/3.0

OJ2005 这是第几天

设计到闰年平年所以不深入了解
在这里插入图片描述

OJ2007 平方和和立方和

陷阱题你不知道n,m哪个大

#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	int n,m;
	int res1,res2;
	int temp;
	while(cin>>n>>m){
		if(n>m){//陷阱 
			temp=n;
			n=m;
			m=temp;
		}
		res1=0,res2=0;
		for(int i=n;i<=m;i++){
			if(i%2==0) {
				res1+=i*i;
			}
			else res2+=i*i*i;
		}
		cout<<res1<<" "<<res2<<endl;
	}
	
	return 0;
}

OJ 2012 判断是否为素数

#include <iostream>
using namespace std;
int n;
//试除法
bool isPrime (int x){
    if(x<2) return false ;
    for(int i=2;i<=x/i;i++){
        if(x%i==0) return false ;
    }
    return true;
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        int a;
        cin>>a;
        if(isPrime(a)) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

OJ2017 判断读取字符串中字符是否为数字

判断是否为数字方法:
bool isdigital(char c){
//判断是否为数字
return (c>=‘0’&&c<=‘9’) ;
}
字符串的读取方法:getline(cin,s),用cin>>s不行因为可能会有空格
遍历字符串中字符方法:
for(int i=0;i<s.length();i++)

#include <iostream>
#include <string>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

bool isdigital(char c){
	//判断是否为数字
	return (c>='0'&&c<='9') ;
}
int main(int argc, char** argv) {
	int n;
	cin>>n;
	int nums;
	for(int i=0;i<n;i++){
		nums=0;
		string s;
		cin>>s;
		 for(int i=0;i<s.length();i++){
		 	char c=s[i];
		 	if(isdigital(c)){
		 		//是数字
				 nums++; 
			 }
		 }
		 cout<<nums<<endl;
	}

	return 0;
}

OJ2018

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
在这里插入图片描述

OJ 2023 二维vector 数组

vector 二维数组创建 vector<vector> v(n,vector(m));
二维数组作为函数参数 double count1(vector< vector > &v,int n)
二维数组的行数和列数
int r=v.size();//行数
int l=v[0].size();//列数

#include <iostream>
#include <vector>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//对于每个测试实例,输出3行数据,第一行包含n个数据,表示n个学生的平均成绩,结果保留两位小数;第二行包含m个数据,表示m门课的平均成绩,结果保留两位小数;

//计算学生平均成绩
double count1(vector< vector<double> > &v,int n){//n表示计算第几行学生成绩 注意从0开始 
	int r=v.size();//行数
	int l=v[0].size();//列数
	double sum=0;
	for (int i=0;i<l;i++){
		sum+=v[n][i];
	}
	return sum/l;
} 
//计算m门课的平均成绩 
double count2(vector< vector<double> > &v,int x){//x代表计算第几门课 ,注意从0开始 
	int r=v.size();//行数
	int l=v[0].size();//列数
	double sum=0;
	for (int i=0;i<r;i++){
		sum+=v[i][x];
	}
	return sum/r;
}
//判断是否各科成绩均大于等于平均成绩
 
int main(int argc, char** argv) {
	int n,m;//n代表学生数,m表示科目数
	int nums;//高于平均分的人数 
	while(cin>>n>>m){
	nums=0;
	vector< vector<double> > v(n,vector<double>(m));
	vector <double> r; 
	vector <double> k;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			double a;cin>>a;
			v[i][j]=a;
		}
		cin.ignore();
	}
	//输出n个学生成绩平均
	for(int i=0;i<n;i++){
		r.push_back(count1(v,i));
		printf("%.2f",count1(v,i));
		cout<<" ";
	} 
	cout<<endl;
	//输出m门科目成绩平均
	for(int j=0;j<m;j++){
		k.push_back(count2(v,j));
		printf("%.2f",count2(v,j));
		cout<<" ";
	}
	cout<<endl;
	//表示该班级中各科成绩均大于等于平均成绩的学生数量。
	for(int i=0;i<n;i++){
		bool bigger=true;
		for(int j=0;j<m;j++){
			if(v[i][j]<k[j]){
				bigger=false;
				break;
			}
		}
		if(bigger) nums++;
	}
	cout<<nums; cout<<endl;
	v.clear();r.clear();k.clear(); 
	} 
	return 0;
}

OJ 2024 C语言的合法标识符

先判断是不是以下划线或字母开头,然后依次判断后面的字符是不是都为数字或字母。

OJ 2015 字符串后面+东西

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string s;
    while (cin>>s) {
        // 找到字符串中的最大字母
        char max='a';
		 for(int i=0;i<s.length();i++){
		 	char temp=s[i];
		 	if(temp>max){
		 		max=temp;
			 }
		 }
        // 遍历字符串,在最大字母后面插入“(max)”
        string result;
        for (int i=0;i<s.length();i++) {
        	char temp=s[i];
            result += temp;
            if (temp == max) {
                result += "(max)";
            }
        }

        cout << result << endl;
        max='a';
    }

    return 0;
}

OJ2027 数组参数

在这里插入图片描述

OJ2031 进制准换

在这里插入图片描述

OJ2032 杨辉三角

在这里插入图片描述

OJ2036 多边形面积(不太可能考)

在这里插入图片描述

OJ 2037 设计动态规划

跳过

OJ2040 亲和数

找出所有的约数
在这里插入图片描述

OJ2041 楼梯问题

在这里插入图片描述

OJ2044 蜂巢

在这里插入图片描述
在这里插入图片描述

OJ2045、2046 、2047、2048、2049、2050递推问题

OJ2053 开关灯小游戏

在这里插入图片描述

OJ2054 A==B?

在这里插入图片描述
问题核心:清除前导0和小数点后多余的0
以及若出现1.0000的情况把小数点也删除

string clear(string s){
	//清除前导0 
	int start=0; int l;
	int end=s.length()-1;
	int dot=s.find('.');//找到字符串中小数点位置 
	while(s[start]=='0') start++;//找到起始坐标
	if(dot==-1){
		//说明没有小数点
		l=end-start+1;
		return s.substr(start,l); 
	}
	while(s[end]=='0') end--;//找到终止坐标 
	if(dot==end){
		//说明小数点后都是0
		l=dot-start;
		return  s.substr(start,l);
	}else {
		l=end-start+1;
		return s.substr(start,l);
	}
}

OJ 2055 略

OJ 2056 两矩阵的相交区域

在这里插入图片描述

OJ2057 还是进制转换问题略

OJ2058 暴力做做出来但是超时了

#include <iostream>
#include <vector>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
vector < pair<int,int> > count(int N,int M){
	pair<int,int> p;
	vector< pair<int,int> > v;
	for(int i=1;i<=N;i++){
		if(i==M) {
			p.first=p.second=M;
			v.push_back(p);
		}
		else{
			for(int j=i+1;j<=N;j++){
				if((j-i+1)*(i+j)/2==M){
					p.first=i; p.second=j;
					v.push_back(p);
				}
			}
		}
	}
	return v;
}
int main(int argc, char** argv) {
	int N,M;
	vector< pair<int,int> > v;
	while(cin>>N>>M &&(N||M)){
		v=count(N,M);
		for(int i=0;i<v.size();i++){
			cout<<"["<<v[i].first<<","<<v[i].second<<"]"<<endl;
		}
		v.clear();
	}
	return 0;
}

OJ2059龟兔赛跑

动态规划

OJ2061 算GPA略

杭电历年真题笔记

在这里插入图片描述在这里插入图片描述

进制转换问题 09年

注意:假如是负数先要转化为正数
stack 用法:
在这里插入图片描述
进制转换的思路看OJ2031
十六进制转化为十进制数
在这里插入图片描述

24年1题

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值