一些零碎小知识点
常用头文件
1 2 3 4 5 6 7
| #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<vector> #include<bits/stdc++.h>
|
动态数组
1 2 3 4
| #include <iostream> #include <vector>
vector<int> a(n);
|
输入输出
1 2 3
| cin>>n cout<<a[i]<<endl cout<<a[i]<<"\n"
|
指针定义二维数组
1 2 3 4 5 6 7 8 9 10 11 12 13
| a = (int **)calloc(n,sizeof(int *));
for(int i=0;i<n;i++){ a[i]=(int *)calloc(n,sizeof(int)); }
free(a); for(int i=0;i<n;i++){ free(a[i]); }
|
输入到文件末尾
1 2 3
| while(scanf("%d",&a)!=EOF) while(cin>>a)
|
ASCII表
1 2
| 大写字母 A-Z 对应的 ASCII 码是 65-90 小写字母 a-z 对应的 ASCII 码是 97-122
|
字符串处理
1 2 3 4 5
| '\0' 空字符 scanf输入到空格即停止 gets会输入空格 输入到换行符停止(换行符也会被读入) gets会把空格当' '保存 而scanf会把他当'\0' sscanf ssprintf memset strlen
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
sscanf(s,"%d",&c); sprintf(s,"%d",&c);
memset(s,0,sizeof(s));
string s; getline(cin,s);
string s,s1; s+=s1;
char s[100],s1[100] strcat(s,s1);
string s,s1; s=s1;
char s[100],s1[100] strcpy(s1,s);
string s; s.substr(a,b); s.substr(a);
string s,s1; s.find(s1) s.find(s1,a) if(s.find(s1)==string::npos)
char s[100],s1[100]; strstr(s,s1)
string s,s1; s.insert (a,s1);
string s; for(int i=0;i<s.length;i++){ s[i]=toupper(s[i]) }
int cs(string s){ string s1="VK"; int c=0; int b=s.find(s1); while(s.find(s1,b)!=string::npos){ c++; b=s.find(s1,b+1); } return c; }
strcmp(str1,str2)
strcpy(str1,str2)
strcat(str1,str2)
to_string(int a)
|
质数判断
1 2 3 4 5 6 7 8 9 10
|
bool prime(int n){ if(n==1||n==0) return false; for(int i=2;i*i<=n;i++){ if(n%i==0) return false; } return true; }
|
switch语句举例
1 2 3 4 5 6 7 8 9 10 11 12
| switch (month) { case 12: case 1: case 2: printf("冬季\n"); break; case 3: case 4: case 5: printf("春季\n"); break; }
|
最大公因数
欧几里得算法,两个数相除,将余数作为新除数,直到除尽为止
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| int gcd(int a,int b){ if(b==0) { return a; } else return gcd(b,a%b); }
int gcd(int a,int b){ while(b!=0){ int temp=b; b=a%b; a=temp; } return a; }
|
斐波那契
第1项 0 第2项 1 ,之后的每项都为前两项之和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| int f(int n){ if(n==1) return 0; if(n==2) return 1; else return f(n-1)+f(n-2); }
int f(int n){ if(n==1) return 0; if(n==2) return 1; else { int a=0,b=1; for(int i=3;i<=n;i++){ int t=a+b; a=b; b=t; } return b; } }
|
闰年
高精度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| string multiply(string num1,int num2){ string result = ""; int carry=0; for(int i=num1.length()-1;i>=0;i--){ int product=(num1[i]-'0')*num2+carry; result=to_string(product%10)+result; carry=product/10; } while(carry>0){ result=to_string(carry%10)+result; carry/=10; } return result; } 字符串高精度乘法 sort(a+1,a+n+1); 排a[1]到a[n]
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ``` ### 汉诺塔 ```c++ //递归写法 void digui(int n,char a,char b,char c){ //n个盘移动从a移动到c,通过b if(n==1) { cout<<a<<"-->"<<c<<endl; } else { digui(n-1,a,c,b);//n-1个盘移动从a移动到b,通过c cout<<a<<"-->"<<c<<endl; digui(n-1,b,a,c);//n-1个盘移动从b移动到c,通过a } } //迭代写法 用栈
|
整数划分(不是很懂)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include<bits/stdc++.h> using namespace std; int digui(int n,int m){ if(n==0||m==1) return 1; if(n>=m){ return digui(n,m-1)+digui(n-m,m); } else return digui(n,n); } int main(){ int n; while(cin>>n){ cout<<digui(n,n)<<endl; } return 0; }
|
auto current = circle.begin()
vector.begin()
vector.end()
push_back(value):将元素添加到vector的末尾。
pop_back():移除vector的最后一个元素。
size():返回vector中元素的个数。
empty():检查vector是否为空,如果为空返回true,否则返回false。
clear():清空vector中的所有元素。
resize(newSize):改变vector的大小,使其包含指定数量的元素。
front():返回vector的第一个元素。
back():返回vector的最后一个元素。
at(index):返回指定索引处的元素。
begin() 和 end():返回指向vector首元素和尾后元素的迭代器,用于遍历vector中的元素。
insert(iterator, value):在指定位置之前插入元素。
erase(iterator):移除指定位置的元素。
swap(vector2):交换两个vector容器的元素。
大整数乘法