本人已经把该博客代码部分整理,在另一篇博客中:
【超级完整-更正版】北京理工大学计算机专业复试机试历年真题答案2003年-2018年
目 录
1-2014-输出三个最近使用文件有重复就不打乱文件顺序 47
题目是我简写的,代码注重逻辑,有些可能没有规范输出。如果有任何疑问,可直接去查年份对应的题目参考综合学习。
1-2003两个空间坐标求球的体积
#include<iostream>
#include<vector>
#include<iomanip>
#include<cmath>
#define Max 100
double const PI=3.141592;
using namespace std;
class ThreeDimensionalSpace{
public:
double x;
double y;
double z;
public :
ThreeDimensionalSpace(double x1,double y1,double z1)
{
x = x1;
y = y1;
z = z1;
}
double operator - (ThreeDimensionalSpace b);
};
double ThreeDimensionalSpace::operator - (ThreeDimensionalSpace b)
{
return sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)+(y-b.y)*(y-b.y));
}
int main()
{
double x1,y1,z1;
double x2,y2,z2;
while(1)
{
cout<<"输入球心坐标"<<endl;
cin>>x1>>y1>>z1;
cout<<"输入球表面的一个坐标"<<endl;
cin>>x2>>y2>>z2;
ThreeDimensionalSpace a(x1,y1,z1);
ThreeDimensionalSpace b(x2,y2,z2);
double r = a-b;
double V = (4/3)*PI*r*r*r;
cout<<setprecision(4)<<setiosflags(ios::fixed);
cout<<"半径="<<r<<"体积="<<V<<endl;
}
}
#include<iostream>
#include<vector>
#include<fstream>
#include<string>
#include<cstring>
using namespace std;
int dayTab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
bool IsLeapYear(int year)
{
return ((year%4==0)&&(year%100!=0))||(year%400==0);
}
bool Isnumber(char a)
{
if((a<'9'||a=='0' )&&(a>'0'||a=='9'))
{
return true;
}else
{
return false;
}
}
//判断字符是否是中文
int IsChinese(char p){
if(~(p >> 8) == 0)
{
return 1;
}
return -1;
}
void GetString(string s,int &year,int &month,int &day)
{
int pos =0;
int k=0;
int size = s.size();
for(int i=0;i!=s.size();i++)
{
if(IsChinese(s[i])==1)
{
string temps= s.substr(pos,i-pos);
pos = i+2;
i++;
int y =stoi(temps);
if(k==0)
{
year = y;
}else if(k==1)
{
month =y;
}else
{
day = y;
}
k++;
}
}
}
int main()
{
string str ="2020年12月31日";
int year,month,day;
GetString(str,year,month,day);
//cout<<year<<" "<<month<<" "<<day<<endl;
int acount=0;
int row = IsLeapYear(year);
for(int i=1;i<month;i++)
{
acount +=dayTab[row][i];
}
acount +=day;
cout<<year<<"-"<<month<<"-"<<day<<"是"<<year<<"年的第"<<acount<<"天"<<endl;
}
#include<iostream>
#include<vector>
#include<fstream>
#include<string>
#include<cstring>
using namespace std;
int main()
{
while(1)
{
cout<<"输入功能: 1、写入文件 2、根据学号查询信息"<<endl;
int id;
cin>>id;
switch(id)
{
case 1:
{
ofstream outfile;
outfile.open("D:\\FileStore.txt");
outfile<<"01 李男 21"<<endl;
outfile<<"02 刘男 20"<<endl;
outfile.close();
break;
}
case 2:
{
cout<<"输入学号"<<endl;
int number;
cin>>number;
cout<<number<<endl;
ifstream infile;
infile.open("D:\\FileStore.txt");
string s;
while(getline(infile,s))
{
string filenum =s.substr(0,2);
int n = stoi(filenum);//字符串转数字
if(number==n)
{
cout<<s<<endl;
}
}
infile.close();
break;
}
}
}
}
#include<iostream>
#include<vector>
#include<iomanip>
#include<cmath>
#define Max 100
using namespace std;
class MutipleClass{
public:
double x;
int n;//vector大小
vector<double>vec;//[Max];
MutipleClass(double y,vector<double>v,int size)
{
x =y;
vec = v;
n =size;
}
double GetResult(vector<double>,int n,double x)
{
if(n==0)
{
return vec[n];
}else
{
return GetResult(vec,n-1,x)+vec[n]*pow(x,n);
}
}
};
int main()
{
int n;
cout<<"输入系数个数"<<endl;
while(cin>>n)
{
double x;
cout<<"输入x的值"<<endl;
cin>>x;
cout<<"输入系数"<<endl;
vector<double>vec;
for(int i=0;i<n;i++)
{
double t;
cin>>t;
vec.push_back(t);
}
MutipleClass m(x,vec,vec.size());
cout<<setprecision(2)<<setiosflags(ios::fixed);
cout<<"结果是="<<m.GetResult(vec,vec.size()-1,x)<<endl;
}
}
2-2004计算正弦函数重载减号
#include<iostream>
#include<cmath>
#include<iomanip>
double const PI = 3.1415;
using namespace std;
class Angle{
private:
double x;
public :
Angle(double n)
{
x=n;
}
Angle operator - (Angle a);
void Sin()
{
double xx =x*PI/180;
cout<<"正弦值是:"<<xx<<endl;
}
};
Angle Angle::operator - (Angle a)
{
Angle T(x-a.x);;
return T;
}
int main()
{
double x,y;
cout<<"输入两个角度计算正弦值:"<<endl;
while(cin>>x>>y)
{
Angle a(x);
a.Sin();
Angle b(y);
b.Sin();
Angle t = a-b;
t.Sin();
}
}
#include<iostream>
#include<cmath>
#include<iomanip>
double const PI = 3.1415;
using namespace std;
int main()
{
double a,b,c;
cout<<"输入a b c"<<endl;
while(cin>>a>>b>>c)
{
if(a==0)
{
cout<<"a不能为零,重新输入"<<endl;
}else
{
double temp = b*b-4*a*c;
if(temp==0)
{
cout<<setprecision(2)<<setiosflags(ios::fixed);
cout<<"只有一个解x="<<-(b/(2*a))<<endl;
}else if(temp<0)
{
cout<<"无解"<<endl;
}else
{
double x1 = (-b+sqrt(temp))/(2*a);
double x2 = (-b-sqrt(temp))/(2*a);
cout<<setprecision(2)<<setiosflags(ios::fixed);
cout<<"第一个解x1="<<x1<<endl;
cout<<setprecision(2)<<setiosflags(ios::fixed);
cout<<"第二个解x2="<<x2<<endl;
}
}
}
}
#include<iostream>
#include<iomanip>
using namespace std;
class VirtualNumber{
public :
double vir;
double entity;
public:
VirtualNumber(double e,double v)
{
vir = v;
entity = e;
}
//运算符重载
VirtualNumber operator +(VirtualNumber v);
//类型转换函数,实现double x=a的赋值
operator double(){
return vir+entity;
}
void show()
{
cout<<setprecision(2)<<setiosflags(ios::fixed);
cout<<entity<<"+"<<vir<<"i"<<endl;
}
};
VirtualNumber VirtualNumber::operator +(VirtualNumber v)
{
VirtualNumber t(entity+v.entity,vir+v.vir);
return t;
}
int main()
{
double x1,y1,x2,y2;
cout<<"输入两个复数并相加输出 "<<endl;
while(cin>>x1>>y1>>x2>>y2)
{
VirtualNumber a(x1,y1);
VirtualNumber b(x2,y2);
VirtualNumber c = a+b;
c.show();
double x = a;
cout<<setprecision(2)<<setiosflags(ios::fixed);
cout<<a<<endl;
}
}
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
class Cpoint{
double x,y;
public:
Cpoint(double xx,double yy){
x =xx;
y =yy;
}
double operator-(Cpoint c);
};
double Cpoint::operator-(Cpoint c){
return sqrt((x-c.x)*(x-c.x)+(y-c.y)*(y-c.y));
}
class CTriangle{
public:
double x1,y1;
double x2,y2;
double x3,y3;
public:
CTriangle (int a,int b,int c,int d,int e,int f)
{
x1=a;
y1=b;
x2=c;
y2=d;
x3=e;
y3=f;
}
CTriangle operator+(CTriangle c);
void BuildTriangle()
{
Cpoint A(x1,y1);//在纵坐标上
Cpoint B(x2,y2);//原点
Cpoint C(x3,y3);//横坐标
int len1 = A-B;
int len2 =B-C;
int len3 =A-C;
cout<<"三角形是"<<endl;
cout<<"A"<<endl;
for(int row=0;row<len1;row++)
{
cout<<"|";
for(int i=0;i<row+1;i++)
{
cout<<" ";
}
cout<<"\\"<<endl;
}
cout<<"B";
for(int col=0;col<len1;col++)//这个三角形的底边长和题目不一样,否则三角形不好看,为了调整降低了三角形的底边长度
{
cout<<"-";
}
cout<<"C"<<endl;
}
};
CTriangle CTriangle::operator+(CTriangle c)
{
CTriangle t(x1+c.x1,y1+c.y1,x2+c.x2,y2+c.y2,x3+c.x3,y3+c.y3);
return t;
}
int main()
{
CTriangle T(0,0,0,0,0,0);//初始化一个三角形,可以叠加
double x,y;
string s;
cout<<"输入纵坐标、横坐标"<<endl;
while(getline(cin,s))
{
if(s=="0")
{
T.BuildTriangle();
}else
{
int pos = s.find(" ");
int x=stoi(s.substr(0,pos+1));//从字符串中获取x
int y=stoi(s.substr(pos+1));//从字符串中获取y
cout<<"输入第一个坐标"<<endl;
CTriangle N(0,y,0,0,x,0);
T = N+T;
T.BuildTriangle();
}
}
}
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
//从字符串中取出数字
void GetString(string str,vector<int>&vec)
{
int pos = 0;
for(int i=0;i<str.size();i++)
{
if(str[i]==',')
{
string temps = str.substr(pos,i-pos);
int n = stoi(temps);//字符串转整型,在头文件string中
pos = i+1;
//遇到0就结束,不再取数字
if(n!=0)
{
vec.push_back(n);
}else
{
return;
}
}
}
string temps = str.substr(pos);
int n = stoi(temps);
vec.push_back(n);
}
//把数字逆序
int Reverse(int x)
{
int tempn=0;
while(x!=0)
{
tempn *=10;
tempn +=x%10;
x /= 10;
}
return tempn;
}
//类
class GetReverse {
public:
int number;
int renumber;
public:
GetReverse(int n,int ren)
{
number = n;
renumber = ren;
}
void show(){
cout<<number<<" "<<renumber<<endl;
}
};
int main()
{
string str ="1234,2356,7891,5678";
vector<int>vec;
vector<GetReverse>vex;
//while(cin>>str)
//{
GetString(str,vec);
//控制十个数量
for(int i=0;i<vec.size()&&i<10;i++)
{
GetReverse T(vec[i],Reverse(vec[i]));
vex.push_back(T);
}
for(int i=0;i<vex.size();i++)
{
vex[i].show();
}
//}
}
#include<iostream>
#include <iomanip>
using namespace std;
double GetPath(double h,int n)
{
if(n==1)
{
//小心第一次是小球从高处落到底就是一次,路径就是H
return h;
}else
{
return h+h/2+GetPath(h/2,n-1);
}
}
int main()
{
int m;
//cin>>m;
double h;
int n;
while(cin>>m)
{
for(int i=0;i<m;i++)
{
cin>>h>>n;
//printf("%.2lf\n",GetPath(h,n));
//控制C++输出精度
cout << setprecision(2) << setiosflags(ios::fixed);
cout<<GetPath(h,n)<<endl;
}
//cout<<GetPath(h,n)<<endl;
}
}
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
class Cpoint{
double x,y;
public:
Cpoint(double xx,double yy){
x =xx;
y =yy;
}
double operator-(Cpoint c);
};
double Cpoint::operator-(Cpoint c){
return sqrt((x-c.x)*(x-c.x)+(y-c.y)*(y-c.y));
}
int main()
{
cout<<"输入第一个坐标"<<endl;
int x1,y1;
cin>>x1>>y1;
Cpoint a(x1,y1);
cout<<"输入第二个坐标"<<endl;
int x2,y2;
cin>>x2>>y2;
Cpoint b(x2,y2);
cout<<"两个坐标之间的距离是"<<a-b<<endl;
cout<<setprecision(4)<<setiosflags(ios::fixed);
cout<<sqrt(2)*2<<endl;
printf("%.4lf",2*sqrt(2));
}
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
class Student{
public:
char name[10];
int num;
public:
Student(){
}
Student(char n[10],int m)
{
strcpy(name,n);
num =m;
}
public:
void show()
{
cout<<"姓名:"<<name<<" 学号:"<<num<<endl;
}
};
bool compareDec(Student x,Student y)
{
return x.num>y.num;
}
bool compareAsc(Student x,Student y)
{
return x.num<y.num;
}
int main()
{
vector<Student>vec;
int id;
char name[10];
int number;
while(1){
cout<<"输入需要的功能,1:添加学生 2:查询某个学生 3:降序浏览学生 4:升序浏览学生"<<endl;
cin>>id;
switch(id)
{
case 1:
{
cout<<"输入添加的学生数目"<<endl;
int n;
cin>>n;
cout<<"输入学生名字 学号"<<endl;
while(n--)
{
cin>>name>>number;
//strcpy(names,name);
Student stu(name,number);
vec.push_back(stu);
}
break;
}
case 2:
{
cout<<"输入学生学号"<<endl;
cin>>number;
int flag=0;
for(int i=0;i<vec.size();i++)
{
if(vec[i].num==number)
{
vec[i].show();
flag =1;
}
}
if(flag==0)
{
cout<<"没有查找到"<<endl;
}break;
}
case 3:
{
sort(vec.begin(),vec.end(),compareDec);//降序
for(int i=0;i<vec.size();i++)
{
vec[i].show();
} break;
}
case 4:
{
sort(vec.begin(),vec.end(),compareAsc);//降序
for(int i=0;i<vec.size();i++)
{
vec[i].show();
} break;
}
}
}
}
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
class Cpoint{
double x,y;
public:
Cpoint(double xx,double yy){
x =xx;
y =yy;
}
double operator-(Cpoint c);
};
double Cpoint::operator-(Cpoint c){
return sqrt((x-c.x)*(x-c.x)+(y-c.y)*(y-c.y));
}
class CTriangle{
double x1,y1;
double x2,y2;
double x3,y3;
public:
CTriangle (int a,int b,int c,int d,int e,int f)
{
x1=a;
y1=b;
x2=c;
y2=d;
x3=e;
y3=f;
}
void Print()
{
Cpoint A(x1,y1);
Cpoint B(x2,y2);
Cpoint C(x3,y3);
int len1 = A-B;
int len2 =B-C;
int len3 =A-C;
if(len1>len3)//需要len3大
{
swap(len1,len3);
}
if(len2>len3)//需要len3大
{
swap(len2,len3);
}
if(len3*len3 == len2*len2+len1*len1)
{
cout<<setprecision(2)<<setiosflags(ios::fixed);
cout<<"Yes"<<"边长是"<<len1+len2+len3<<endl;
}else
{
cout<<"不是三角形"<<endl;
}
}
};
int main()
{
int m;
while(cin>>m){
int x1,y1,x2,y2,x3,y3;
while(m--)
{
cin>>x1>>y1>>x2>>y2>>x3>>y3;
CTriangle Test(x1,y1,x2,y2,x3,y3);
Test.Print();
}
}
#include<iostream>
#include<vector>
#include<string>
#include<string>
using namespace std;
int daytab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},//平年
{0,31,29,31,30,31,30,31,31,30,31,30,31}//闰年
};
bool IsLeapYear(int year)
{
return(year%4 == 0&& year%100 !=0)||(year%400==0);
}
int MuchDay(int year,int month,int day)
{
int number =0;
int row = IsLeapYear(year);
for(int j=0;j<month;j++)
{
number +=daytab[row][j];
}
number +=day;
return number;
}
void GetString(string str,int &year,int &month,int &day)
{
int pos=0;
int t =0;
for(int i=0;i<str.size();i++)
{
if(str[i]=='-')
{
string temps = str.substr(pos,i-pos);
int time = stoi(temps);
pos = i+1;
if(t==0){
year = time;
}else if(t==1)
{
month = time;
}
t++;
}
}
string temps = str.substr(pos);
int time = stoi(temps);
day = time;
}
int NumberOfYear(int year)
{
if(IsLeapYear(year))return 366;
else return 365;
}
int main()
{
string str ="2016-02-29";
int number =100;
int year,month,day;
GetString(str,year,month,day);
//先把月和日转换成天数,再去先后计算年,月,日
int amount =MuchDay(year,month,day);
while(number>NumberOfYear(year))
{
number -=NumberOfYear(year);
year++;
}
month =0;
int row = IsLeapYear(year);
while(number>daytab[row][month])
{
number -=daytab[row][month];
month++;
}
day =number;
cout<<year<<"-"<<month<<"-"<<day;
}
#include<iostream>
#include<vector>
#include<string>
#include<string>
using namespace std;
int daytab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},//平年
{0,31,29,31,30,31,30,31,31,30,31,30,31}//闰年
};
bool IsLeapYear(int year)
{
return(year%4 == 0&& year%100 !=0)||(year%400==0);
}
int MuchDay(int year,int month,int day)
{
int number =0;
int row = IsLeapYear(year);
for(int j=0;j<month;j++)
{
number +=daytab[row][j];
}
number +=day;
return number;
}
void GetString(string str,int &year,int &month,int &day)
{
int pos=0;
int t =0;
for(int i=0;i<str.size();i++)
{
if(str[i]=='-')
{
string temps = str.substr(pos,i-pos);
int time = stoi(temps);
pos = i+1;
if(t==0){
year = time;
}else if(t==1)
{
month = time;
}
t++;
}
}
string temps = str.substr(pos);
int time = stoi(temps);
day = time;
}
int main()
{
string str1 ="2000-02-29";
string str2 ="2020-02-29";
int year1,month1,day1;
int year2,month2,day2;
GetString(str1,year1,month1,day1);
GetString(str2,year2,month2,day2);
//cout<<year1<<" "<<month1<<" "<<day1;
int apart=0;
if(year1==year2)//在同一个年里,直接两个天数相减
{
if(month1>month2)
{
apart = MuchDay(year1,month1,day1)-MuchDay(year2,month2,day2);
}
else{
apart = MuchDay(year2,month2,day2)-MuchDay(year1,month1,day1);
}
}else//不在同一个年里
{
if(year1>year2)//如果第一个年大
{
if(IsLeapYear(year2))//把第二个年的剩余天数加起来
{
apart += 366 -MuchDay(year2,month2,day2);
}else{
apart += 365 -MuchDay(year2,month2,day2);
}
for(int i=year2+1;i<year1;i++)//把间隔的年的天数加起来
{
if(IsLeapYear(i))
{
apart +=366;
}
else
{
apart +=365;
}
}
apart +=MuchDay(year1,month1,day1);//把最大的年目前有多少天加起来
}else
{
if(IsLeapYear(year1))//第二个年大 ,则把第一年的剩余多少天加起来
{
apart += 366 -MuchDay(year1,month1,day1);
}
else{
apart += 365 -MuchDay(year1,month1,day1);
}
for(int i=year1+1;i<year2;i++)
{
if(IsLeapYear(i))
{
apart +=366;
}
else
{
apart +=365;
}
}
apart +=MuchDay(year2,month2,day2);
}
}
cout<<"两个年相差天数 "<<apart;
}
#include<iostream>
#include<vector>
using namespace std;
class A{
};
class B{
};
int main()
{
cout<<"输出被除数和除数"<<endl;
int a,b;
cin>>a>>b;
vector<int>arr;
try{
if(b==0)
{
throw A();
}else
{
cout<<"结果是"<<a/b<<endl;
}
cout<<"输入数组长度"<<endl;
int length;
cin>>length;
cout<<"输入数组元素"<<endl;
//int i=0;
int n;
while(cin>>n)
{
if(n==0)break;
arr.push_back(n);
}
if(arr.size()>length)
{
throw B();
}
for(int i=0;i<arr.size();i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}catch(A){
cout<<"被除数是0"<<endl;
}catch(B){
cout<<"数组越界"<<endl;
}
}
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include<fstream>
using namespace std;
int main()
{
string str;
int i=1;
string ss="";
while(cin>>str)
{
stringstream scout;//数字转字符
scout<<i;
string n = scout.str();
i++;
ss.append(n);
ss.append("=");
ss.append(str);
ss.append(" ");
//ofstream myfile;
ofstream outfile;
outfile.open("D:\\Name.txt");
outfile<<ss;
outfile.close();
cout<<ss<<endl;
}
}
#include<iostream>
#include<vector>
#include<algorithm>
#define Max 100
using namespace std;
struct Child{
int data;
int count;
};
struct Answer{
int group;
Child child[Max];
};
void getString(vector<int>&vec,string str)
{
//vector<int>vec;
int pos;
for(int i=0;i<str.size();i++)
{
if(str[i]==',')
{
int n = str[i-1] -'0';
vec.push_back(n);
//cout<<n<<endl;
}
}
int n = str[str.size()-1] -'0';
vec.push_back(n);
}
int main()
{
string parents = "3,2,3,8,8,2,3";//父母数组
string child ="1,2,3,2,1,3,1";//孩子数组
vector<int>vecp;
vector<int>vecd;
getString(vecp,parents);
getString(vecd,child);
//父母数组中的元素
vector<int>temp1 =vecp;
sort(temp1.begin(),temp1.end());
temp1.erase(unique(temp1.begin(),temp1.end()),temp1.end());
int n1 = temp1.size();
// 孩子数组中的元素
vector<int>temp2 =vecd;
sort(temp2.begin(),temp2.end());
temp2.erase(unique(temp2.begin(),temp2.end()),temp2.end());
int n2 = temp2.size();
Answer *answer = new Answer[vecp.size()];
//初始化 ,用一个结构体,包含孩子数组叫groupid,父母数组的元素和每个元素的出现次数count
for(int i=0;i<temp2.size();i++)
{
answer[i].group =temp2[i];
int t=0;
for(int j =0;j<vecd.size();j++)
{
int pp =vecp[j];
answer[i].child[pp].data =pp;
answer[i].child[pp].count =0;
}
}
//计算每个元素出现的次数并以该元素为下标
for(int i=0;i<temp2.size();i++)
{
answer[i].group =temp2[i];
int t=0;
int ac;
for(int j =0;j<vecd.size();j++)
{
if(temp2[i]==vecd[j])
{
answer[i].child[vecp[j]].count +=1;
ac = answer[i].child[vecp[j]].count;
}
}
}
//打印结果
for(int i=0;i<temp2.size();i++)//按孩子数组元素总类打出多少行
{
cout<<answer[i].group<<"={";
for(int j=0;j<temp1.size()-1;j++)//打印出每个父母数组中的每个元素和元素的次数
{
int tt = temp1[j];
cout<<answer[i].child[tt].data<<"="<<answer[i].child[tt].count<<",";//因为最后一个元素后面没有逗号,就把最后一个元素和元素次数摘出来单独打印
}
cout<<answer[i].child[temp1[temp1.size()-1]].data<<"="<<answer[i].child[temp1[temp1.size()-1]].count<<"}"<<endl;
}
}
#include<iostream>
#include<vector>
#include<algorithm>
#define Max 100
using namespace std;
struct Word{
string words;
int number;
}arr[Max];
bool Compare(Word a,Word b)
{
return a.number>b.number;
}
int main()
{
string str="I am a teacher and I think you are a student,so i think you lie.";
int pos=0;
vector<string>vec;
vector<string>vex;
for(int i=0;i<str.size();i++)
{
if(str[i]==' ' ||str[i]==',' || str[i]=='.')
{
string w = str.substr(pos,i-pos);
pos = i+1;
if(w!="")
{
vec.push_back(w);
//cout<<w<<endl;
}
}
}
vex =vec;
sort(vex.begin(),vex.end());
vex.erase(unique(vex.begin(),vex.end()),vex.end());//必须先排序,该方法是去除相邻重复元素
cout<<vex.size()<<endl;
int k=0;
for(int j=0;j<vex.size();j++)
{
//cout<<vex[j]<<" "<<count(vec.begin(),vec.end(),vex[j])<<endl;
arr[k].words = vex[j];
arr[k].number =count(vec.begin(),vec.end(),vex[j]);//STL的count函数,很好用,计算第三个参数在vector中频率
k++;
}
sort(arr,arr+k,Compare);//数组排序,自定义排序规则
for(int m=0;m<k;m++)
{
cout<<arr[m].words<<" "<<arr[m].number<<endl;
}
}
#include<iostream>
#include<stack>
#include<vector>
#include<ostream>
#include<string>
using namespace std;
/*
中缀建立二叉树的思路:
1.预处理字符串:把字符串中的每个部分都切割出来放进vector,因为存在有点数字是两位数以上,不能用字符串的下标去定位操作数。
2.先中缀转后缀
(1)符号进站,操作数直接输出,比较新来的符号和栈顶,栈顶大于或等于新来符号,循环输出栈顶直至栈顶不大于等于新来符号
3.后缀建立二叉树
(1)New一个结点,把结点data等于操作数然后进栈
(2)遇到符号,在栈中pop出两个元素进行,先后把结点的右孩子data赋值第一个元素,左孩子data赋值给第二个元素
*/
/*
遇到的几个新颖技术点:
1.字符转字符串:头文件<ostream> string s(1,字符),输出s就是字符串了
*/
typedef struct TreeNode{
string tag;
int data;
TreeNode *rchild,*lchild;
}Tree;
int Priority(char a,char b)//a是top,b是准备进栈元素
{
int p;
switch(a)
{
case '+':
case '-':
if(b=='*'||b=='/')
{
p= -1;break;
}else if(b=='+'||b=='-')
{
p= 0;break;
}
case '*':
case '/':
if(b=='*'||b=='/'){
p=0;break;
}else if(b=='+'||b=='-')
{
p=1;break;
}
case '(':
p = -1;break;
}
return p;
}
bool judge(char a)//判断是数字
{
int temp = a- '0';
for(int i=0;i<10;i++)
{
if(temp==i)
{
return true;
}
}
return false;
}
void GetString(vector<string>&vec,string str){
int pos=0;
for(int i=0;i<str.size();i++)
{
if(judge(str[i]) && !judge(str[i+1]))//该字符是数字,后一个是符号 ,则把数字部分截取出来
{
string temp = str.substr(pos,i-pos+1);//截取数字部分
if(temp!="")
{
vec.push_back(temp);
}
}
else if(judge(str[i]) && judge(str[i+1]))//前后是数字部分 ,继续计算数字的长度
{
pos = i;
}else //前后都是字符,则pos往后移动
{
string s(1,str[i]);//把单个字符转为字符串。需要头文件ostream
vec.push_back(s);
pos =i+1;
}
}
}
bool IsNumber(string str)//只需判断第一个字符是不是数字就判断是不是字符串
{
if(str[0]>'0'&&str[0]<'10')
{
return true;
}
else
{
return false;
}
}
void PrintTree(TreeNode *T){
if(T==NULL)
{
return;
}
PrintTree(T->lchild);
PrintTree(T->rchild);
cout<<T->data<<" ";
}
int Deal(int a,int b,string x)
{
if(x=="*")
{
return a*b;
} else if(x=="/")
{
return b/a;
}else if(x=="-")
{
return b-a;
}else if(x=="+")
{
return a+b;
}
}
void BuildTree(vector<string> vex)//通过后缀表达式建立二叉树
{
stack<TreeNode*>ss;//放后缀转树的栈
TreeNode *T = NULL;
for(int j=0;j<vex.size();j++)
{
if(IsNumber(vex[j]))
{
T = new TreeNode;
int n = stoi(vex[j]);
T->data =n;
T->lchild =NULL;
T->rchild =NULL;
ss.push(T);
}else//操作符
{//pop出两个元素并处理
int a,b;
T = new TreeNode;
if(!ss.empty())
{
a= ss.top()->data;
T->rchild =ss.top();
ss.pop();
}
if(!ss.empty())
{
b= ss.top()->data;
T->lchild =ss.top();
ss.pop();
}
T->data = Deal(a,b,vex[j]);//处理加减乘除
ss.push(T);
}
}
PrintTree(T);
}
int main()
{
stack<string>st;//转后缀的栈
//<TreeNode>ss;//放后缀转树的栈
vector<string> vec;//存放处理后的中缀表达式
vector<string> vex;//存放后缀表达式
//string str="2*(70-2)+50*20+80";
string str="1+((2+3)*4)-5";//12 3 + 4 * + 5 –
GetString(vec,str);//把每个字符放进vec,因为有两位数以上的数字,这个方法就是解决这个问题,把每个部分都放进vector
//以下算法为中缀转后缀
for(int i=0;i<vec.size();i++)//小心这几个if else if 是先后顺序的,先过滤掉数字,过滤掉"("")",还有栈为空必须在比较优先级之前,否则栈为空没有栈顶就报错
{
if(vec[i]=="("){//放进栈
st.push(vec[i]);
}
else if(vec[i]==")")//找到最近的那个(,并输出括号中符号
{
string top = st.top();
while(!st.empty()&&top!="(")
{
cout<<top<<" ";
vex.push_back(top);
st.pop();
top = st.top();
}
st.pop();//注意别忘了,要把"("也Pop出去
}else if(IsNumber(vec[i]))//是数字直接输出
{
vex.push_back(vec[i]);
cout<<vec[i]<<" ";
}else if(st.empty())//栈是空的,直接进栈
{
st.push(vec[i]);
}else if(!st.empty()){//栈不为空,则把字符和栈顶比较
if(Priority(st.top()[0],vec[i][0])!=-1)//栈顶大或者等于,出栈 ****小心是栈顶大于或等于新来 符号就输出栈顶
{
while(!st.empty() &&Priority(st.top()[0],vec[i][0])!=-1)//把所有栈顶大于或等于的栈顶输出
{
string top = st.top();
st.pop();
vex.push_back(top);
cout<<top<<" ";
}
st.push(vec[i]);//把新来的字符放进栈
}else
{
st.push(vec[i]);//其他符号直接放进栈
}
}
}
while(!st.empty())//输出栈中的内容
{
vex.push_back(st.top());
cout<<st.top()<<" ";
st.pop();
}
cout<<endl;
BuildTree(vex);
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
GetWord(vector<string>&vec,string str)
{
int pos;
for(int i=0;i<str.size();i++)
{
if(str[i]==' ')
{
string temps = str.substr(pos,i-pos);
pos=i+1;
vec.push_back(temps);
}
}
string temps = str.substr(pos);
vec.push_back(temps);
}
int main()
{
string str = "temp temper mop mort morning";
vector<string>vec;
GetWord(vec,str);
//去重复元素
vec.erase(unique(vec.begin(),vec.end()),vec.end());
for(int i=0;i<vec.size();i++)
{
int num=0;
for(int j=0;j<vec.size();j++)
{
char te = vec[i][0];
char mp = vec[j][0];
if(te==mp)
{
num++;
}
}
cout<<vec[i]<<" "<<num<<endl;
}
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
3. 给一个字符串(aaaa(bbbb(cccc,dddd),eeee(ffff)))该字符串
表明的是各人的层次关系
比如aaaa是bbbb和eeee的领导,bbbb是cccc和dddd的领导
现输入一个名称,比如ffff,要求输出其领导关系
输出:aaaa>eeee>ffff
*/
/*
//(aaaa(bbbb(cccc,dddd),eeee(ffff)))
//top 3 2 1 0 1
如ffff
在top==1 && 字符为'('时,处理字符串,在结果字符串中:加入eeee> ,变成eeee>ffff
在top==2 && 字符为'('时,处理字符串,在结果字符串中:加入aaaa>,变成aaaa>eeee>ffff
top==3时,满足,这里不写出来,因为后面我们会去掉
同理:
如eeee
//(aaaa(bbbb(cccc,dddd),eeee(ffff)))
//top 2 1 0 1
在top==1 && 字符为'('时,处理字符串,在结果字符串中:加入aaaa> ,变成aaaa>ffff
同理top==2不写出来
*/
int main()
{
string str1, str2, str="";
vector<string> vc;
str1="(aaaa(bbbb(cccc,dddd),eeee(ffff)))";
str2="ffff";
int tag=0;
int pos = str1.find(str2);
str.append(str2);
int count=0;//领导的长度
int index=0;
int number=0;//和tag搭配使用,当tag = 1+number时候就是遇到领导的时候
for(int i=pos;i>=0;i--){//思路,处理字符串,匹配括号,截取字符串 联想到括号匹配,这里对栈的处理进行了变形
if(str1[i]==')'){//给括号标号
tag--;
}else if(str1[i]=='('){
tag++;
}
if(index!=0){
if(str1[i]==',' or str1[i]=='('){
//index是包括领导的长度,所以要减去领导长度,截取出领导
string s = str1.substr(index-count, count);
cout<<s<<" ";
str.insert(0,s);
count=0;
index=0;
number++;//第几个领导
}else{
count++;//计算领导长度
}
}
if(str1[i]=='(' and tag==number+1){//tag==number是关键思想
str.insert(0,">");
index = i;//Index记录的是领导后面的一个(或者,
}
}
//cout<<str<<endl;
cout<<str.substr(1)<<endl;//最后多加了一个>
return 0;
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
GetWord(vector<string>&vec,string str)
{
int pos;
for(int i=0;i<str.size();i++)
{
if(str[i]==' ')
{
string temps = str.substr(pos,i-pos);
pos=i+1;
vec.push_back(temps);
}
}
string temps = str.substr(pos);
vec.push_back(temps);
}
int main()
{
string str = "btemp atemper imop pmort morning";
vector<string>vec;
GetWord(vec,str);
//去重复元素
//vec.erase(unique(vec.begin(),vec.end()),vec.end());
sort(vec.begin(),vec.end());
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<" ";
}
}
4-2011-表达式中截取数字主要针对两位数以上的数字
#include<iostream>
#include<stack>
#include<vector>
#include<ostream>
void GetString(vector<string>&vec,string str){
//vector<string> vec;
int pos=0;
string test="";
//2*(70-20)+50*20
for(int i=0;i<str.size();i++)
{
if(judge(str[i]) && !judge(str[i+1]))//该字符是数字,后一个是符号 ,则把数字部分截取出来
{
string temp = str.substr(pos,i-pos+1);//截取数组部分
if(temp!="")
{
test.append(temp);
vec.push_back(temp);
}
}
else if(judge(str[i]) && judge(str[i+1]))//前后是数字部分 ,继续计算数字的长度
{
pos = i;
}else //前后都是字符,则pos往后移动
{
string s(1,str[i]);//把单个字符转为字符串。需要头文件ostream
vec.push_back(s);
pos =i+1;
}
}
}
int main()
{
vector<string> vec;
GetString("2*(70-2)+50*20");
}
#include<iostream>
#include<vector>
#include<algorithm>
#define Max 100
using namespace std;
class Student{
public:
int id;
string name;
char sex;
int age;
Student(){
this->id = NULL;
this->name = "";
this->sex = NULL;
this->age = NULL;
}
Student(int id,string name,char sex,int age)
{
this->id = id;
this->name = name;
this->sex = sex;
this->age = age;
}
int GetId() const {
return this->id;
}
void SetId(int id) {
this->id = id;
}
string GetName(){
return this->name;
}
void SetName(int name) {
this->name = name;
}
int GetAge() const {
return this->age;
}
void SetAge(int age) {
this->age = age;
}
char GetSex() {
return this->sex;
}
void SetSex(int sex) {
this->sex = sex;
}
};
bool Compare(Student x,Student y)
{
//return x.GetId() > x.GetId();
return x.id > y.id;
}
void GetInfo(string str,string &id,string &name,char &sex,int &age)
{
int k=1;
int pos=0;
for(int i=0;i<str.size();i++)
{
if(str[i]==',')
{
switch(k)
{
case 1:
{
id = str.substr(0,i);
//id = stoi(tempid);
k++;pos = i+1;break;
}
case 2:
{name = str.substr(pos,i-pos);
k++;pos = i+1;break;
}
case 3:
{
sex = str[i-1];
k++;pos = i+1;break;
}
}
}
}
string tempage = str.substr(pos);
age = stoi(tempage);
}
int main()
{
string info;
int k=0;
vector<Student>vec;
while(getline(cin,info))
{
string oid;
string sname;
char ssex;
int sage;
if(info[0]=='I')//插入
{
GetInfo(info,oid,sname,ssex,sage);
string tempid = oid.substr(1);
int id = stoi(tempid);
Student stu(id,sname,ssex,sage);
vec.push_back(stu);
k++;
}
else//删除
{
string tempid = info.substr(1);
int id = stoi(tempid);
for(int i=0;i<k;i++)
{
if(vec[i].id==id)
{
vec.erase(vec.begin()+i);
k--;
}
}
}
sort(vec.begin(),vec.end(),Compare);
vector<Student>::iterator it;
for(it = vec.begin(); it != vec.end(); ++it)
{
cout<<(*it).id<<" ";
cout<<(*it).name<<" ";
cout<<(*it).age<<" ";
cout<<(*it).sex<<endl;
}
}
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void GetNumber(string str)
{
vector<int>vec;
int size = str.size();
int pos =0;
for(int i=0;i<size;i++)
{
if(str[i]==',')
{
string te=str.substr(pos,i-pos);
pos =i+1;
int num =stoi(te);
vec.push_back(num);
}
}
string te=str.substr(pos);
int num =stoi(te);
vec.push_back(num);
sort(vec.begin(),vec.end());
for(int j=0;j<vec.size()-1;j++)
{
cout<<vec[j]<<",";
}
cout<<vec[vec.size()-1];
cout<<endl;
}
int main()
{
string str="1,2,5,7,9,10,45,67,24,26";
//while(getline(cin,str))
//{
GetNumber(str);
//}
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct TreeNode{
char data;
TreeNode *left,*right;
}Tree;
TreeNode* Create(string str1,string str2)//后序+中序
{
if(str1.size()==0)
{
return NULL;
}
char end = str1[str1.size()-1];//根节点
//cout<<end;
int pos =str2.find(end);
TreeNode *p = new TreeNode();
p->data = end;
int rithtlen =str2.size()-pos-1;//中序右边长度
int leftlen = str2.size()-pos;//中序左边长度
p->right = Create(str1.substr(str1.size()-rithtlen-1,rithtlen),str2.substr(pos+1)
);
p->left = Create(str1.substr(0,pos),str2.substr(0,pos));
return p;
}
void Preorder(TreeNode* T)
{
if(T==NULL)
{
return;
}
printf("%c",T->data);
Preorder(T->left);
Preorder(T->right);
return ;
}
int main()
{
string str1="CHBEDA";
string str2="CBHADE";
//while(cin>>n)
//{
int pos=0;
TreeNode* root =Create(str1,str2);
Preorder(root);
printf("\n");
//}
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int m=15;
int n=20;
int z=m;
if(m<n)
{
int temp =m;
m = n;
n =temp;
}
int q=m;
int p=n;
while(m%n!=0)
{
z = m%n;
m = n;
n = z;
}
cout<<"公约数是"<<z<<endl;
cout<<"公倍数是"<<p*q/z<<endl;
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
string str;
while(getline(cin,str))
{
vector<string>vec;
int size = str.size();
int j = 0;
for(int i=0;i<size;i++)
{
if(str[i]==' ')
{
string temp = str.substr(j,i-j);
j = i+1;
vec.push_back(temp);
}
}
string temp = str.substr(j);
vec.push_back(temp);
// vector<string>::iterator it;
// for(it=vec.begin();it!=vec.end();it++)
// {
// cout<<*it<<" ";
// }
// cout<<endl;
sort(vec.begin(),vec.end());
vector<string>::iterator tt;
for(tt=vec.begin();tt!=vec.end();tt++)
{
cout<<*tt<<" ";
}
cout<<endl;
}
}
#include<iostream>
#include<stack>
using namespace std;
int Priority(char s1,char s2)
{//判断两个运算符s1,s2的优先顺序,
//若s1优先则返回>,若s2优先则返回<,若s1,s2相同则返回=
char f;
int p;
switch(s2)
{
case '+':
case '-':
if(s1=='*'||s1=='/')p=-1;
else if(s1=='+'||s1=='-')p=0;break;
case '*':
case '/':
if(s1=='+'||s1=='-')p= 1;
else if(s1=='*'||s1=='*')p= 0;break;
}
return p;
}
void Reverse(string all)
{
string temp;
for(int i=all.size()-1;i>-1;i--)
{
temp +=all[i];
}
cout<<temp;
}
int main()
{
// cout<<Priority('*','+')<<endl;
// cout<<Priority('+','+')<<endl;
// cout<<Priority('-','/')<<endl;
Reverse("1234");
return 0;
}
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
int Priority(char s1,char s2)
{
char f;
int p;
switch(s2)
{
case '+':
case '-':
if(s1=='*'||s1=='/')p=-1;//+ * 返回-1,栈顶优先级大
else if(s1=='+'||s1=='-')p=0;break;
case '*':
case '/':
if(s1=='+'||s1=='-')p= 1;
else if(s1=='*'||s1=='*')p= 0;break;
case '(':
case ')':
p=0;break;
}
return p;
}
bool Alphabet(char c)//判断是不是字母
{
for(int i=0;i<26;i++)
{
char te ='a'+i;
if(c==te)
{
return true;
}
}
return false;
}
string Reverse(string all)//逆序字符串
{
string temp;
for(int i=all.size()-1;i>-1;i--)
{
temp +=all[i];
}
return temp;
}
int main()
{
/*
算法:
从右开始,是字符就添加进字符串,是右括号进进栈,如果是运算符,
和栈顶比较,栈顶优先级大或者相等就进栈。栈顶优先级小就出栈。出栈的组成字符串,最后逆转字符串输出。
*/
stack<char>tag;
string str="a+b*(c-d)-e/f";
cout<<str<<endl;
string all;
for(int i=str.size()-1;i>0;i--)
{
if(Alphabet(str[i]))
{
all +=str[i];
}
else if(str[i]==')')
{
tag.push(str[i]);
}
else if(str[i]=='(')
{
char c = tag.top();
while(c!=')'&&!tag.empty())
{
tag.pop();
all +=c;
c = tag.top();
}
tag.pop();
}else if(tag.empty()||Priority(str[i],tag.top())==-1 || Priority(str[i],tag.top())==0)
{
//栈顶优先级大就进栈
//栈为空进站
//优先级相同进站
tag.push(str[i]);
}else if(Priority(str[i],tag.top())==1)
{
//栈顶优先级小就出栈
char c = tag.top();
tag.pop();
all +=c;
tag.push(str[i]);
}
}
while(!tag.empty())//把栈中剩余的元素输出
{
char c = tag.top();
tag.pop();
all +=c;
}
cout<<Reverse(all);//反转字符串
return 0;
}
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
bool FindHistory(stack<int>st,int n)
{
int size = st.size();
for(int i=0;i<size&&i<3;i++)
{
int temp = st.top();
st.pop();
if(temp==n)
{
return true;
}
}
return false;
}
int main()
{
stack<int>st;
int n;
cout<<"输入:";
while(cin>>n)
{
cout<<"输出:";
if(FindHistory(st,n))
{
stack<int>sq =st;
int size = sq.size();
for(int i=0;i<size&&i<3;i++)
{
int temp = sq.top();
sq.pop();
cout<<temp<<" ";
}
//cout<<endl;
cout<<"输入:";
}else
{
st.push(n);
stack<int>sq =st;
int size = sq.size();
for(int i=0;i<size&&i<3;i++)
{
int temp = sq.top();
sq.pop();
cout<<temp<<" ";
}
//cout<<endl;
cout<<"输入:";
}
}
}
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int main()
{
stack<int>st;
int n;
cout<<"输入:";
while(cin>>n)
{
int num=0;
st.push(n);
cout<<"输出:";
stack<int>sq =st;
int size = sq.size();
if(size<3)
{
for(int i=0;i<size;i++)
{
int temp = sq.top();
sq.pop();
cout<<temp<<" ";
}
cout<<endl;
cout<<"输入:";
}
else
{
for(int i=0;i<3;i++)
{
int temp = sq.top();
sq.pop();
cout<<temp<<" ";
}
cout<<endl;
cout<<"输入:";
cout<<endl;
}
}
}
3-2014-求广义表的深度
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int main()
{
//stack<char>st;
stack<char>st;
int n;
string str="((c,((d.(e)),f,h),g)";
int max=0;
for(int i=0;i<str.size();i++)
{
if(str[i]=='(')
{
st.push(str[i]);
if(st.size()>max)
{
max = st.size();
}
}else if(str[i]==')')
{
int size = st.size();
for(int i=0;i<size;i++)
{
int temp =st.top();
st.pop();
if(temp==')')
{
break;
}
}
}
}
cout<<"最大是: "<<max;
}
#include<stdlib.h>
#include<stdio.h>
int main()
{
int i,j;
int test=11;//只能输入奇数
int n=(test+1)/2;
//单独输出第一行
for(int k=0;k<2*n-1;k++)
{
printf("*");
}
printf("\n");
//上半个长方形
for(i = 1; i < n; i++)//从第二行开始,打印一半的行数
{
int temp =n-1 - i;//输出直角三角形
for(j = 0; j <= temp; j++)
{
printf("@");
}
for(j = 0; j < 2 * i - 1; j++)//输出正等腰三角形
{
printf(" ");
}
for(j = 0; j <= temp; j++)//输出后半个三角形。别想太复杂 ,和前面个三角形代码一样
{
printf("&");
}
printf("\n");
}
//输出下半个长方形
for(i = 0; i < n-2; i++)//最后一行,和第一行一样,都是直接输出完整一行,就减去2,头一行,尾巴一行
{
int temp = i + 1;
for(j = 0; j <= temp; j++)//输出直角梯形 ,第一行输出两个
{
printf("O");
}
for(j = 0; j < 2 * n-2*i-5; j++)//输出空格的倒三角,根据图形去推理的的公式
{
printf(" ");
}
for(j = 0; j <=temp; j++)//和前一个直角梯形一样的代码
{
printf("*");
}
printf("\n");
}
//最后一行完整输出
for(int k=0;k<2*n-1;k++)
{
printf("*");
}
}
#include <stdio.h>
#define M 256
using namespace std;
char buf[M] = {0};
void fun(int n, int size,string str)//形参n表示当前字符为第n个字符,size表示字符的个数
{
if (n > size)
{
buf[n-1] = '\0';
puts(buf);//输出字符串并换行
return;
}
for (int i = 0; i < str.size(); i++)
{
buf[n-1] = str[i];//不停的覆盖,就实现了更新每个位置的字符
fun(n+1, size,str);
}
return;
}
int main()
{
int n = 2;
string str="abc";
fun(1, n,str);//第一个参数始终是1,表示从第一个字符开始处理
return 0;
}
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int main()
{
stack<int>C;
queue<int>B;
queue<int>D;
stack<int>A;
int n=6;
for(int i=n;i>0;i--)
{
A.push(i);
}
while(!A.empty()||!B.empty()||!C.empty())
{
int trainA = A.top();
A.pop();
if(trainA%2==0)
{
if(C.size()<3||C.size()==3)
{
C.push(trainA);
cout<<trainA<<":A->C ";
}
else{
int trainC = C.top();
C.pop();
//A.push(trainC);
cout<<trainA<<":C->A ";
}
}else
{
if(B.size()<3||B.size()==3)
{
B.push(trainA);
cout<<trainA<<":A->B ";
}
else
{
int trainB = B.front();
B.pop();
//D.push(trainB);
cout<<trainB<<":B->D ";
}
}
while(!B.empty()&& A.empty() )
{
int trainB = B.front();
B.pop();
//D.push(trainB);
cout<<trainB<<":B->D ";
}
while(!C.empty()&&A.empty())
{
int trainC = C.top();
C.pop();
//D.push(trainB);
cout<<trainC<<":C->A ";
}
}
}
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct Node{
string a,b;
};
int compare(Node x,Node y)
{
return x.b<y.b;
}
int main()
{
string str[7] = {"Information","Info","Inform","info","Suite","suite","suit"};
for(int i=0;i<7;i++)
{
cout<<str[i]<<" ";
}
cout<<endl;
Node ss[7];
for(int i=0;i<7;i++)
{
ss[i].a=str[i];//a存原来的单词
ss[i].b=str[i];//b存转换成全部是小写的单词
for(int j=0;j<str[i].size();j++)
{
if(ss[i].b[j]>='A'&&ss[i].b[j]<='Z')//把所有字母转换成小写字母
{
ss[i].b[j] +='a'-'A';
}
}
}
sort(ss,ss+7,compare);
for(int i=0;i<7;i++)
{
cout<<ss[i].a<<" ";
}
cout<<endl;
// char *a = "bBcDeF";
// char *b = "AbCdEf";
// int result = stricmp(a,b);
// cout<<result<<endl;
}
#include<iostream>
#include<string>
#include<vector>
using namespace std;
bool judgeA(char a)
{
for(int i=0;i<26;i++)
{
if((a=='a'+i)||(a=='A'+i))
{
return true;
}
}
return false;
}
int judgeN(string s)
{
for(int i=0;i<s.size();i++)
{
int temp =s[i]-'0';
for(int j=1;j<10;j++)
{
if(temp==j)
{
return i;
}
}
}
return -1;
}
void TailZero(string &s)
{
if(s.find('.')!=-1)//存在小数点
{
int flag =1;//是连续的0
for(int i=s.size()-1;i>0;i--)
{
if(s[i]=='0' && flag ==1)
{
char tt =s[i];
//cout<<tt<<" ";
s.erase(i);
flag ==1;
}else
{
flag =0;
}
}
}
}
void NumberCon(vector<string>&vec,string s)
{
//vector<string>vec;
int pos=0;
//0+123
for(int j=1;j<s.size();j++)
{
if(s[j]=='-'||s[j]=='+')
{
string temp = s.substr(pos,j-pos);
pos = j;
vec.push_back(temp);
}
}
string tt = s.substr(pos);
vec.push_back(tt);
}
void HeadZero(string &s)
{
int pos =judgeN(s);
if(pos==-1)//字符串中没有数字
{
s='0';
}
else
{
int t=-1;
int p1 =s.find('+');
int p2 =s.find('-');
if(p1!=-1)
{
t = p1;
}
else
{
t = p2;
}
for(int k=1;k<pos;k++)
{
s.erase(t+1,1);//小心,一次erase,长度就减一了 ,erase必须是两个参数,第一个是删除的位置,第二个是长度
//cout<<s<<endl;
}
//cout<<s<<endl;
}
}
void Deal(vector<string>&vec,string s)//处理字符串
{
vector<string>vex;
NumberCon(vex,s);
for(int i=0;i<vex.size();i++)
{
// [Error] invalid conversion from 'char' to 'const char*' [-fpermissive]
string temp = *(vex.begin()+i);
//数字前的零
HeadZero(temp);
//处理尾巴存在零
TailZero(temp);
//处理有+45+34.3402的这种字符串,本来应该是两个数字,要分开
vec.push_back(temp);
}
}
int main()
{
vector<string>vec;
//string str="2.3ABC0-2.3+004.5000ABC+000123.300";
//string str ="002.3+3000+34A+00.3000";
//string str="2.3ABC0-2.3";
//string str="2.3ABC0-2.3+004500";//2.3 0 -2.3 +45
string str="+004.500";
string temp="";
string last="";
int flag =0;//没有出现过+ -
for(int i=0;i<str.size();i++)
{
//cout<<str[i]<<endl;
//&&!judgeS(str[i])
if(!judgeA(str[i])){//不是字母
temp +=str[i];
}
else if((temp!=last) && (temp !=""))
{
flag=0;
last = temp;
Deal(vec,temp);
//NumberCon(temp);
//vec.push_back(temp);
}
else{
temp ="";
}
}
if(temp!="")
{
//cout<<temp<<endl;
Deal(vec,temp);
}
cout<<"输出: "<<endl;
for(int j=0;j<vec.size();j++)
{
cout<<vec[j]<<endl;
}
}
#include<iostream>
#include<string>
#include <sstream>
using namespace std;
int main()
{
float pi=0;
float accurate = 0.01;
//while(cin>>accurate)
//{
float n=4;
float t =3;
float temp=0;
int k=1;
pi = n;
while((n/t)>accurate)
{
if(k%2==0)
{
pi += n/t;
}else
{
pi -= n/t;
}
t +=2;
k++;
//cout<<pi<<endl;
}
cout<<k<<endl;
cout<<pi<<endl;
//}
}
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
void judge(double a)
{
ostringstream mos;//构造字符串流
mos<<a;
string l=mos.str();//double转字符串
//string l=to_string(a);
int pos = l.find('.');
cout<<l<<endl;
cout<<pos;
//return l.length()-pos-1;
}
int main()
{
judge(0.001);
}
#include<iostream>
#include<string>
#include <vector>
using namespace std;
typedef struct LNode{
int data;
struct LNode * next;
}LNode,*LinkList;
string trim(string &s)
{
for(int i=0;i<s.size();i++)
{
if(s[i]==' ')
{
s.erase(i,1);
}
}
return s;
}
void GetNumber(string s,vector<int>&vec)
{
int j=0;
for(int i=0;i<s.size();i++)
{
if(s[i]==' ')
{
string temp= s.substr(j,i-j);
j=i+1;
int number = stoi(temp);
//vector<int>vec;
vec.push_back(number);
}
}
string te=s.substr(j);
int num = stoi(te);
vec.push_back(num);//最后一个子串加进去
}
void PrintL(LinkList L)
{
LinkList t = L->next;
while(t!=NULL)
{
cout<<t->data<<" ";
t= t->next;
}
cout<<endl;
}
void Insert(LinkList &L,int n)
{
LNode *p,*temp;
p = L;
if(p->next==NULL)
{
temp =(LNode*)malloc(sizeof(LNode));
temp->data = n;
L->next = temp;
temp->next = NULL;
//cout<<"头插入成功"<<endl;
return;
}
while((p->next!=NULL)&&(p->next->data>n))
{
p = p->next;
}
temp =(LNode*)malloc(sizeof(LNode));
temp->data = n;
temp->next = p->next;
p->next = temp;
//cout<<n<<"插入成功"<<endl;
return ;
}
int main()
{
string str="9 8 7 6 5 4 3 2 1";
//cout<<"字符串大小是"<<str.size()<<endl;
//string str="246137";
//string str;
//while(getline(cin,str))
//{
LinkList Jlist =(LinkList)malloc(sizeof(LinkList));
Jlist->next=NULL;
LinkList Olist =(LinkList)malloc(sizeof(LinkList));
Olist->next=NULL;
vector<int>vec;
GetNumber(str,vec);
for(int i=0;i<vec.size();i++)
{
int t = vec[i];
//cout<<t<<endl;
if(t%2!=0)
{
Insert(Jlist,t);
//cout<<"奇数是"<<t<<endl;
}else
{
Insert(Olist,t);
//cout<<"偶数是"<<t<<endl;
}
}
PrintL(Jlist);
PrintL(Olist);
//}
// string str ="10 21 3 46 5 6 7";
// vector<int>vec;
// GetNumber(str,vec);
// for(int j=0;j<vec.size();j++)
// {
// cout<<vec[j]<<endl;
// }
// cout<<str<<endl;
// trim(str);
// cout<<str<<endl;
}
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int MAX=100;
struct student{
string name;
string id;
int score[MAX];
int nopass;//没有及格数
};
student arr[MAX];
void init(int n,int m)
{
for(int i=0;i<n;i++)
{
arr[i].nopass=0;
int num=0;
for(int k=0;k<m;k++)
{
if(arr[i].score[k]<60)
{
num++;
}
}
cout<<arr[i].name<<" "<<num<<endl;
arr[i].nopass=num;
}
}
bool Compare(student x,student y)
{
return x.nopass>y.nopass;
}
int main()
{
int n=5;
int m=3;
arr[0].name="飞机";arr[0].score[0]=70;arr[0].score[1]=80;arr[0].score[2]=91;
arr[1].name="轮船";arr[1].score[0]=20;arr[1].score[1]=20;arr[1].score[2]=20;
arr[2].name="汽车";arr[2].score[0]=60;arr[2].score[1]=80;arr[2].score[2]=90;
arr[3].name="单车";arr[3].score[0]=50;arr[3].score[1]=50;arr[3].score[2]=60;
arr[4].name="卡卡";arr[4].score[0]=30;arr[4].score[1]=60;arr[4].score[2]=60;
init(n,m);
sort(arr,arr+n,Compare);
for(int i=0;i<n;i++)
{
cout<<arr[i].name<<endl;
}
}
#include<iostream>
#include<string>
#include <sstream>
using namespace std;
int forlength(string s,int i)
{
if(s[i]=='\0')
{
return 0;
}
else
{
return 1+forlength(s,i+1);
}
}
int main()
{
string str;
while(cin>>str)
{
cout<<forlength(str,0)<<endl;
}
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
GetWord(vector<string>&vec,string str)
{
int pos;
for(int i=0;i<str.size();i++)
{
if(str[i]==' ')
{
string temps = str.substr(pos,i-pos);
pos=i+1;
vec.push_back(temps);
}
}
string temps = str.substr(pos);
vec.push_back(temps);
}
int main()
{
string str = "btemp atemper imop pmort morning";
vector<string>vec;
GetWord(vec,str);
//去重复元素
//vec.erase(unique(vec.begin(),vec.end()),vec.end());
sort(vec.begin(),vec.end());
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<" ";
}
}
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int MAX=100;
struct student{
string name;
int c1;
int c2;
int c3;
};
student arr[MAX];
student didnt[MAX];
bool Compare(student x,student y)
{
int a=x.c1+x.c2+x.c3;
int b=y.c1+y.c2+y.c3;
return a>b;
}
int main()
{
int n=5;
//while(cin>>n)
//{
// for(int i=0;i<n;i++)
// {
// cin>>arr[i].name>>arr[i].c1>>arr[i].c2>>arr[i].c3;
//
// }
arr[0].name="飞机";arr[0].c1=70;arr[0].c2=80;arr[0].c3=91;
arr[1].name="轮船";arr[1].c1=20;arr[1].c2=20;arr[1].c3=20;
arr[2].name="汽车";arr[2].c1=60;arr[2].c2=70;arr[2].c3=80;
arr[3].name="单车";arr[3].c1=50;arr[3].c2=50;arr[3].c3=50;
arr[4].name="卡卡";arr[4].c1=30;arr[4].c2=60;arr[4].c3=60;
int k=0;
for(int i=0;i<n;i++)
{
if(arr[i].c1<60||arr[i].c2<60||arr[i].c3<60)
{
didnt[k]=arr[i];
k++;
}
}
sort(didnt,didnt+k,Compare);
for(int i=0;i<k;i++)
{
cout<<didnt[i].name<<endl;
}
//}
}
#include <stdio.h>
#define M 256
using namespace std;
char buf[M] = {0};
void fun(int n, int size,string str)//形参n表示当前字符为第n个字符,size表示字符的个数
{
if (n > size)
{
buf[n-1] = '\0';
puts(buf);//输出字符串并换行
return;
}
for (int i = 0; i < str.size(); i++)
{
buf[n-1] = str[i];//不停的覆盖,就实现了更新每个位置的字符
fun(n+1, size,str);
}
return;
}
int main()
{
int n = 2;
string str="abc";
fun(1, n,str);//第一个参数始终是1,表示从第一个字符开始处理
return 0;
}
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
vector<string>vec;
string str="ac cf bgn oo qq pp";
//cout<<str;
int num =0;
int j=0;
for(int i=0;i<str.size();i++)
{
if(str[i]==' ')
{
string tt;
tt=str.substr(j,i-j);//逐个把子串加进去
vec.push_back(tt);
j=i+1;
}
}
string te=str.substr(j);
vec.push_back(te);//最后一个子串加进去
sort(vec.begin(),vec.end());
for(int k=0;k<vec.size();k++)
{
cout<<vec[k]<<endl;
}
}
#include<iostream>
using namespace std;
int main()
{
char ID[]={'1','0','X','9','8','7','6','5','4','3','2'};
//cout<<ID[0]<<endl;
//cout<<ID[1]<<endl;
int Wi[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
//string Ai="110130197606175317";
string Ai="11020019750117522X";
//cin>>Ai;
int S=0;
for(int i=0;i<Ai.size()-1;i++)
{
int temp = Ai[i]-'0';
S +=temp*Wi[i];
}
int Y= S%11;
cout<<"Y="<<Y<<endl;
//char result = ID[Y];
cout<<"result="<<ID[Y]<<endl;
if(ID[Y]==Ai[17])
{
cout<<"Yes";
}
else
{
cout<<"No";
}
}
#include<iostream>
#include<list>
#include<vector>
#include<algorithm>
//算法思想,参考博客
//https://blog.csdn.net/weixin_43145361/article/details/89061051
using namespace std;
vector<string>all;
void traverse(vector<char>a,vector<char>b)//递归实现博客中所描述的树
{
if(a.size()>0)//a是第一个原来的字符串,b是排列的字符串
{
for(int i =0;i<a.size();i++)
{
b.push_back(a[i]);//逐个把a中字符放入b中
a.erase(a.begin()+i);//就把a中元素移走
traverse(a,b);//递归去排列元素
a.insert(a.begin()+i,b[b.size()-1]);//把拿出来那个元素放回a中
b.erase(b.begin()+b.size()-1);//就把b中的这个元素移走
}
}
else
{
string temp;
vector<char>::iterator it;
for(int i=0;i<b.size();i++)//把vector中排列组成一个字符串
{
temp +=b[i];
//cout<<b[i]<<" ";
}
all.push_back(temp);//放入全局的vector,后面要进行重复的字符串删除处理
}
}
int main()
{
vector<char>vec;
vector<char>result;
string str="abc";
for(int j=0;j<str.size();j++)//把字符串放入vector
{
vec.push_back(str[j]);
}
traverse(vec,result);
sort(all.begin(),all.end());
all.erase(unique(all.begin(),all.end()),all.end());//51,52行代码是处理重复的字符串
vector<string>::iterator it;
for(it=all.begin();it!=all.end();++it)//输出全排列字符串
{
cout<<*it<<endl;
}
}
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
//https://blog.csdn.net/weixin_43871369/article/details/90523139
string str;
while(cin>>str)
{
map<string,int>number;
for(int i =0;i<=str.size();i++)
{
for(int j=0;j<i;j++)
{
string key=str.substr(j,i-j);//关键点,是截取j<i的所有组合,比如从0-1,0-2,
cout<<key<<endl;
//number[key]++;
}
}
}
return 0;
}
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
int change(int n)
{
int num=0;
while(n)
{
n = n/10;
num++;
}
return num;
}
int main()
{
int n=1;
//int m1= 123456;
//cout<<change(m1);
///while(cin>>n)
//{
int square = n*n;
int lenn=change(n);//计算数字n的长度
int lens=change(n*n);//计算数字n的平方的长度
char* a=new char[lenn];
char* b=new char[lens];
itoa(n,a,10);//把n转为字符串
itoa(square,b,10);把n的平方转为字符串
for(int i=0;i<lenn;i++)
{
int diff = lens-lenn;//右边对齐,开始比
if(a[i]!=b[i+diff])
{
cout<<"No";
return 0;
}
}
cout<<"Yes"<<endl;
return 0;
//}
// char* str=new char[n];
// itoa(n,str,10);
// cout<<str[0]<<" "<<str[1];
}
#include<iostream>
using namespace std;
void BFind(int a[],int n,int m)
{
int low=0;
int high=n-1;
int count=0;
int mid;
while(low<=high)
{
count++;
mid=(low+high)/2;
if(a[mid]==m)
{
cout<<"第"<<mid+1<<"个元素为"<<m<<" 查找次数为"<<count<<endl;
return;
}
else if(a[mid]>m)
{
high = mid-1;
}else
{
low = mid+1;
}
}
cout<<"查找失败 比较次数是"<<count<<endl;
return;
}
int main()
{
int a[]={-90,-32,12,16,24,36,45,59,98,120};
int n;
while(cin>>n)
{
BFind(a,10,n);
}
// BFind(a,10,24);
// BFind(a,10,120);
// BFind(a,10,6);
}
#include<iostream>
using namespace std;
int main()
{
int n=21;
int test =(n+1)/2;
for(int i=0;i<test;i++)
{
for(int j=0;j<test-i-1;j++)
{
cout<<" ";
}
for(int j=0;j<2*i+1;j++)
{
cout<<"*";
}
cout<<endl;
}
for(int i=0;i<test-1;i++)
{
for(int j=0;j<i+1;j++)
{
cout<<" ";
}
for(int j=0;j<n-2-2*i;j++)
{
cout<<"*";
}
cout<<endl;
}
}
#include<iostream>
using namespace std;
int main()
{
int n=10;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n-i;j++)
{
cout<<" ";
}
for(int j=1;j<=2*(i-1)+1;j++)
{
cout<<"*";
}
cout<<endl;
}
}
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
const int MAX =1000;
char len[MAX];
int main()
{
string str1="bcdaopk",str2="abefpko";
//cin>>str1>>str2;
int k=0;
for(int i =0;i<str1.size();i++)
{
char t=str1[i];
if(str2.find(t)!=-1)
{
len[k]=t;
k++;
}
}
sort(len,len+k);
for(int j=0;j<k;j++)
{
cout<<len[j];
}
cout<<endl;
}
#include<iostream>
#include<math.h>
#include<string>
using namespace std;
bool judgePrime(int n)//判断素数
{
int k=sqrt(n);
int i;
for(i=2;i<=k;i++)
{
if(n%i==0)
{
break;
}
}
if(i>k)
{
return true;
}
else
{
return false;
}
}
int main()
{
/*
算法:
是:则再去判断 t-n是不是素数,是就满足条件
不是:n=n-2;继续去循环去判断n
*/
int n=10;//n是偶数
int t=n;
n--;//n是偶数,减一是奇数
int k =t/2;//只判断一半,比如n=10,则只需要计算到1~5的数字就够了,因为该题问的是一个偶数由那两个奇数组成。
while(n>=k)
{
if(judgePrime(n))
{
int m=t-n;//组成n的其中一个元素,比如t=10,这里的m=1,n=9;
if(judgePrime(m))//判断m是不是素数
{
cout<<t<<"="<<n<<"+"<<m<<endl;
}
}
n=n-2;//奇数减去2还是奇数
}
return 0;
}
3-2018-奇偶数拆分为两个链表
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
/*
*输入字符串,分别将偶数奇数拆分在两条链表上存储
*/
typedef struct Lnode{
int data;//数据域
struct Lnode *next; //指针域
}Lnode,*Linklist;
void PrintL(Linklist L)
{
Linklist t = L->next;
while(t!=NULL)
{
cout<<t->data<<" ";
t= t->next;
}
cout<<endl;
}
void Insert(Linklist &L,int m){
Lnode *p,*temp;
p = L;
if(p->next==NULL)
{
temp = (Lnode*)malloc(sizeof(Lnode));
temp->data= m;
temp->next = NULL;
L->next = temp;
return;
}
while((p->next!=NULL)&&(p->next->data<m)){//查找插入位置 ,****注意条件 p->next!=NULL不能少
p =p->next;
}
temp = (Lnode*)malloc(sizeof(Linklist));
temp->data= m;
temp->next = p->next;
p->next = temp;
return;
}
int main()
{
Linklist h1 = (Linklist)malloc(sizeof(Linklist));
h1->next =NULL;//偶数链表
Linklist h2 = (Linklist)malloc(sizeof(Linklist));
h2->next=NULL;//存奇数链表
string str="246137";
//while(cin>>str)
for(int i=0;i<str.size();i++)
{
int number = str[i]-'0';//字符转整型
if(number%2==0)
{
cout<<"偶数= "<<number<<endl;/*****当number=4时候,调试就卡在这一行不走了******/
Insert(h1,number);
}else
{
cout<<"奇数= "<<number<<endl;
Insert(h2,number);
}
}
PrintL(h1);
PrintL(h2);
//}
}
4-2018-回文的判断
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
string str="abcCBA";
//cin>>str;
//while(cin>>str)
//{
stack<char>st;
int i=0;
for(;i<str.size()/2;++i)
{
st.push(str[i]);
}
if(str.size()%2!=0)
{
i++;
}
while(i<str.size())
{
char temp =st.top();
st.pop();
if(str[i]==temp||(str[i]==temp+32)||(str[i]+32==temp))//因为不知道谁是a,A.就都尝试在两边加32试试,如果是,说明是大小字母的关系
{
i++;
}
else
{
break;
}
}
if(st.empty())
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
//}
}
4-2018-打印梯形
#include<iostream>
using namespace std;
int main()
{
int n=5;
//while(cin>>n)
//{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n-i;j++)
{
cout<<" ";
}
for(int j=1;j<=2*i+n-2;j++)
/*
/比如n=4
i j
刚好 j=2*i+n-2
*/
{
cout<<"*";
}
cout<<endl;
}
//}
}