1、数学类问题
(1)反序数
int Reverse(int m){
int a=0;
while(m!=0){
int r=m%10;
a=10*a+r;
m=m/10;
}
return a;
}
(2)求因子(相乘)
vector<int> F;//求i的因子
for(int j=1;j<=i/2;j++){
if(i%j==0){
F.push_back(j);
}
}
(3)进制转换
vector<int> r;
while(n!=0){
r.push_back(n%2);
n=n/2;
}
for(int i=r.size()-1;i>=0;i--){
cout<<r[i];
}
2、叠筐
题目 :先保存构建的图形、再输出
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
char a,b;
while(cin>>n>>a>>b){
char matrix[80][80];
for(int i=0;i<=n/2;i++){
//(i,i)左上角(j,j)右下角
int j=n-1-i;
int len=n-2*i;
char in;
//判断是内圈还是外圈(不能只用flag因为数量不同,内外圈划分不同)
if((n/2-i)%2==0)
in=a;
else
in=b;
for(int k=0;k<len;k++){
//画个圈
matrix[i][i+k]=in;
matrix[i+k][i]=in;
matrix[j][j-k]=in;
matrix[j-k][j]=in;
}
}
//记得判断只有1个的情况
if(n!=1){
matrix[0][0]=' ';
matrix[0][n-1]=' ';
matrix[n-1][0]=' ';
matrix[n-1][n-1]=' ';
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<matrix[i][j];
}
printf("\n");
}
printf("\n");
}
}
3、闰年与月份天数
用数组记录天数,方便之后的计算
//月份记录
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))
}
4、日期差值
一天天的求
while((y1<y2) || (m1 < m2) || (d1 < d2)){//第一个日期没有达到第二个日期时循环
d1++;//天数加一
if(d1 == month[m1][isLeap(y1)]+1){//满当月天数
m1++;//日期变为下个月的一号
d1=1;
}
if(m1==13){//月份满十二个月
y1++;//日期变为下一年的一月
m1=1;
}
ans++;//相差天数+1
}
5、坠落的蚂蚁
题目 当最终结果只关心某个元素时,可以考虑模糊其他元素的身份区别,只关心他们对所求元素的影响,将这种影响抽象出来作为解题思路可以大大降低编程难度。
#include<bits/stdc++.h>
using namespace std;
typedef struct Ant{
int loc;
int vel;
};
bool cmp(Ant a1,Ant a2){
return a1.loc<a2.loc;
}
int main(){
int N;
while(cin>>N){
vector<Ant> ants;
Ant t;
int p;
for(int i=0;i<N;i++){
cin>>t.loc>>t.vel;
if(t.vel==0)
p=t.loc;
ants.push_back(t);
}
vector<Ant> ants_l;
vector<Ant> ants_r;
for(int i=0;i<N;i++){
if(ants[i].loc<p&&ants[i].vel==1){
ants_l.push_back(ants[i]);
}else if(ants[i].loc>p&&ants[i].vel==-1){
ants_r.push_back(ants[i]);
}
}
sort(ants_l.begin(),ants_l.end(),cmp);
sort(ants_r.begin(),ants_r.end(),cmp);
int sub=ants_l.size()-ants_r.size();
if(sub==0){
cout<<"Cannot fall!"<<endl;
}else if (sub>0){
cout<<100-ants_l[sub-1].loc<<endl;
}else{
cout<<ants_r[ants_l.size()].loc<<endl;
}
}
}
6、将句子分词
while(s.find(' ')!=string::npos){
int tmp=s.find(' ');
len=tmp-pos;
list.push_back(s.substr(pos,len));
pos=tmp+1;
s[tmp]='0';
}
7、浮点加法
题目 对于精度很大的数,直接用float和double没有办法解决,因此用字符串一一进行计算
#include<bits/stdc++.h>
using namespace std;
int main(){
string num1;
string num2;
while(cin>>num1>>num2){
vector<char> res;
int sub=0,add=0;
int p1=num1.find('.');
int p2=num2.find('.');
int xiaoshu1=num1.size()-p1-1;
int xiaoshu2=num2.size()-p2-1;
for(int i=0;i<abs(p2-p1);i++){
if(p1<p2)
num1='0'+num1;
else
num2='0'+num2;
}
for(int i=0;i<abs(xiaoshu1-xiaoshu2);i++){
if(xiaoshu1<xiaoshu2)
num1=num1+'0';
else
num2=num2+'0';
}
for(int i=num1.size()-1;i>=0;i--){
if(num1[i]=='.'){
res.push_back(num1[i]);
}else{
add=num1[i]-'0'+num2[i]-'0'+sub;
if(add>=10)
sub=1;
else
sub=0;
res.push_back(add%10+'0');
}
}
for(int i=res.size()-1;i>=0;i--){
cout<<res[i];
}
cout<<endl;
}
}
8、KMP算法(字符串匹配)
//求解next数组
void getNext(string pattern){
int k=-1;
int j=0;
next[0]=-1;
while(j<pattern.size()-1){
if(k==-1||pattern[k]==pattern[j]){
k++;
j++;
next[j]=k;
}else{
k=next[k];
}
}
}
void KMP(string txt,string pattern){
int i = 0, j = 0;
while (i < txt.size() && j < pattern.size()) {
if (j == -1 || s1[i] == s2[j]) {
i++;
j++;
}
else {
j = Next[j];
}
//多次匹配
if(j==pattern.size()){
number++;//记录次数
j=Next[j];
}
}
//只需要匹配一次
if (j >= n2) {
cout << i - n2+1 << endl;
}
else
cout << -1 << endl;
}
}
STL使用
string
(1)找子串(可以是字符也可以是字符串)find(a)
,返回匹配到的位置,否则返回string::npos
注意事项List
break
只能终止距离它最近的循环(循环!!)while(scanf("%d",&m)!=EOF)
用于不知道结尾的多循环体。scanf
的返回值是成功赋值的变量数目,如果都没有成功赋值,返回-1(EOF
)sort(first,end,cmp)
排序,其中cmp
可以自定义,当返回true
的时候,第一个元素排在第二个元素之前- 需要按位读取数字的时候,可以直接用
string
类型 - 统计字母的时候,可以利用字母的ASCII码,转换为数字保存
- 数据转换(1)
char到string:利用string(size_t n, char c)
char a = 48;
string b(1,a); //正确
string到char*:利用c_str()
char* c;
string s="1234";
c = s.c_str();
printf/scanf(格式化)
速度比cin/cout
(流)快,cout之所以效率低,是先把要输出的东西存入缓冲区,再输出,导致效率降低。
string
字符串查找比char*
慢char
保存字符串数组最后一位是'\0'