注意点总结
一、分母是一个式子时很容易写成n/a-b,应该是n/(a-b)
二、初始化问题,while循环内部要记得初始化:vector数组 .clear();
三、注意忽略换行符
cin.ignore(); // 忽略换行符 典型题OJ2017
四、数组作为参数放入函数中
void count(string s,vector nums) 这种参数不加&不会对main主函数中的nums进行修改
知识点总结
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;
}
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;
cin.ignore();
int nums;
for(int i=0;i<n;i++){
nums=0;
string s;
getline(cin,s);//输入n串字符串
for(int i=0;i<s.length();i++){
char c=s[i];
if(isdigital(c)){
//是数字
nums++;
}
}
cout<<nums<<endl;
}
return 0;
}
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语言的合法标识符
先判断是不是以下划线或字母开头,然后依次判断后面的字符是不是都为数字或字母。
OJ2027 数组参数
OJ2031 进制准换
vector v={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};
OJ2032 杨辉三角
OJ2036 多边形面积
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;
}