一,关于字符串的输入
1.cin.getline();
#include<iostream>
using namespace std;
int main()
{
char s[1000];
cin.getline(s,1000);
//当读入换行符的时候,结束;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int t;
char s[1000];
cin>>t;
//在我们输入t的值后,这里的换行符会被cin.getline();
//直接接收,所以我们要加一个getchar();
getchar();//用来接收换行符
int n=1;
while(t--)
{
if(n!=1) getchar();
cin.getline(s,1000);
cout<<s<<endl;
//每结束一次循环,这里的换行符会被下一层的cin.getline()接收
//因此我们也要在合适的位置加上getchar();
n++;
}
return 0;
}
2.getline(cin,string s);
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int t;
cin>>t;
string s;
int n=1;
getchar();
while(t--)
{
if(n!=1) getchar();
getline(cin,s);
//意思是读入一行字符串,包含空格
cout<<s<<endl;
//这一个和上面的在输出方面的话,
//建议使用for循环进行输出,
n++;
}
return 0;
}
3.cin
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
char s[1000];
while(t--)
{
cin>>s+1;
//这种方法不需要考虑换行符的问题
cout<<s+1<<endl;
}
return 0;
}
二,math
1.
公式
#include<cmath>
sqrt(); //开平方
cbrt(); //开立方
abs(); //绝对值
pow(a,b); //a的b次方
判断一个数是否为质数
#include<iostream>
#include<cmath>
using namespace std;
int p(int a)
{
for(int i=2;i<=a/i;i++)//不推荐i<=sqrt(a) 这样会比较慢
{
if(a%i==0) return 0;
}
return 1;
}
/*
求一个数的最大因子
个人所知道的最快的方法(试除)
在1~k中找到一个a使得 n/a 最小
n=8 k=7
1*8 (1~k中没有8,排除)
2*4
4*2
8*1
最小为 2
for(int i=1;i<=sqrt(n);i++)
{
if(n%i==0)
{
if(n/i<=k) num=min(num,i);
if(i<=k) num=min(num,n/i);
}
}
*/
int main()
{
int a;
cin>>a;
if(p(a)==1) cout<<"YES";
else cout<<"NO";
return 0;
}
最大公约数与最小公倍数
__gcd(a,b);求a,b的最大公约数,头文件为algorithm
但是有的时候__gcd使用不了
所以需要我们自己写一个
#include<iostream>
using namespace std;
int gcd(int a,int b)
{
int mx,mn;
mx=max(a,b),mn=min(a,b);
if(mx==mn) return mx;
else
{
mx=mx-mn;
gcd(mx,mn);
}
}/*
int gcd(int a,int b)
{
return (b>0)?gcd(b,a%b):a;
}
*/
int main()
{
int a,b;
cin>>a>>b;
int m=gcd(a,b),n;
//m为公约数,n为公倍数
n=a*b/m;
cout<<m<<" "<<n;
return 0;
}
三,输入
1.
while(~scanf("%d",&a))
while(scanf("%d",&a)!=EOF)
//无限次的读入
四,数组的初始化
1.
#include<cstring>
//memeset();函数在头文件 cstring中
int a[n];
memset(a,0,sizeof(a));
//将数组的值初始化为0;
五,全排列
//next_permutation
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[]={2,5,3,6,3,6,7,3,7,8};
//运用全排列之前需要先排序
sort(a,a+10);
do{
for(int i=0;i<=9;i++)
cout<<a[i]<<" ";
cout<<endl;
}while(next_permutation(a,a+10));//范围必须带上
return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int tmp;
int a[4][5];//规定从1,1开始,因此有12个格子
for(int i=0;i<pow(2,12);i++) //二进制的思想
{
tmp=i;
for(int j=1;j<=3;j++)
{
for(int k=1;k<=4;k++)
{
a[j][k]=tmp%2;
tmp/=2;
}
}
//就这样每进行一次i,就会全排列一次
//蓝桥杯2017初赛方块分割,蓝桥杯2016初赛剪邮票(这两个我均用到了这种方法)
}
return 0;
}
六,C++排序
1.升序降序
sort();
2,判断升序降序
is_sorted();
#include<iostream>
#include<algorithm>//头文件
using namespace std;
bool cmp(int a,int b)
{
return a>b;//降序
}
//sort,is_sorted 均可使用
int main()
{
int a[]={2,3,1,1,44,56,22};
// a表示从a[0]开始
// a+7表示前7个数
sort(a,a+7);//默认升序
cout<<is_sorted(a,a+7)<<endl;//升序返回true(1)
for(int i=0;i<7;i++) cout<<a[i]<<" ";
cout<<endl<<endl;
sort(a,a+7,cmp);//自定义降序
cout<<is_sorted(a,a+7)<<endl;//降序返回false(0)
for(int i=0;i<7;i++) cout<<a[i]<<" ";
return 0;
}
一道例题
链接:https://ac.nowcoder.com/acm/contest/13493/D
来源:牛客网
小明同学最近喜欢上了排列组合,但是现在有这样的一道题把他难住了,
已知有一组数字(2,5,3,6,3,6,7,3,7,8)共10个,
对于这组数字进行排列后,可以将排列好的数字分为三个部分,
且三个部分都是分别有序的(升序或逆序),
小明想知道能够有满足条件的多少种排列方式?
#include<iostream>
#include<algorithm>
using namespace std;
int s;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int a[]={2,5,3,6,3,6,7,3,7,8};
sort(a,a+10);
do{
int mm=0;
for(int i=0;i<=7;i++)
{
for(int j=i+1;j<=8;j++)
{
if((is_sorted(a,a+i+1)||is_sorted(a,a+i+1,cmp))&&
(is_sorted(a+i+1,a+j+1)||is_sorted(a+i+1,a+j+1,cmp))&&
(is_sorted(a+j+1,a+10)||is_sorted(a+j+1,a+10,cmp)))
{
mm=1;
break;
}
}
if(mm) break;
}
if(mm) s++;
}while(next_permutation(a,a+10));
cout<<s;
return 0;
}
七,reverse函数
头文件 algorithm
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
//反转string
string ss="aaabbbbccccc";
cout<<ss<<endl;
reverse(ss.begin(),ss.end());
cout<<ss<<endl;
//反转char字符数组
char a[100];
cin.getline(a,sizeof(a));
int m=strlen(a);
cout<<a<<endl;
reverse(a,a+m);
cout<<a<<endl;
//反转整型数组
int aa[100];
for(int i=0;i<10;i++) cin>>aa[i];
for(int i=0;i<10;i++) cout<<aa[i];
cout<<endl;
reverse(aa,aa+10);
for(int i=0;i<10;i++) cout<<aa[i];
return 0;
}