前言:写这篇博客完全是给自己当做笔记用的,考虑到自己的c++基础不是很踏实,只在大一学了一学期,c++的面向对象等更深的知识也一直没去学。就是想当遇到一些比较小的知识,切不值得用一整篇
博客去记述的时候,可以考虑到都汇总在这,时不时回来复习一下也挺好。总之,这篇博客可能会不断更新,emmm,内容上也完全是准对我啦(可能更多都是算法上的知识点),大家如果看到了也别吐槽内容太乱太杂或太基础,哈哈。
1三角函数,反三角函数,求夹角
C++中cos,sin,asin,acos这些三角函数操作的是弧度(实数,非复数),而非角度,你需要把角度转化为弧度.
弧度=角度*Pi/180;
对于两条边的夹角θ=acos(v1⋅v2/||v1||||v2||),注意θ是弧度值。
demo如下
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct Point{ 4 double x; 5 double y; 6 }; 7 double PI=3.1415926; 8 double Long=0; 9 double computeLength(Point p1,Point p2) 10 { 11 double l=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); 12 return l; 13 } 14 //求两条边的夹角大小 15 double jiaoDu(Point A,Point B,Point C) 16 { 17 double BA=computeLength(A,B); 18 double BC=computeLength(B,C); 19 double X=(A.x-B.x)*(C.x-B.x)+(A.y-B.y)*(C.y-B.y); 20 double X1=X/BA*BC;//角度变弧度 21 return acos(X1)*180/PI; 22 } 23 //求弧长 24 double huChang(double r,double jiaodu){ 25 double huDu=jiaodu*3.1415926/180; 26 return huDu*r; 27 } 28 int main() 29 { 30 int n=3; 31 cout << "请输入三个点的坐标" << endl; 32 Point point[101]; 33 for(int i=1;i<=n;i++){ 34 cin >> point[i].x; 35 cin >> point[i].y; 36 } 37 38 cout << "向量BA的长度为" << setiosflags(ios::fixed) << setprecision(2)<<computeLength(point[1],point[2]) << endl; 39 cout << "向量BC的长度为" << setiosflags(ios::fixed) << setprecision(2)<<computeLength(point[2],point[3]) << endl; 40 double a=jiaoDu(point[1],point[2],point[3]); 41 cout << "角ABC的大小为为" << setiosflags(ios::fixed) << setprecision(2)<<jiaoDu(point[1],point[2],point[3]) << endl; 42 return 0; 43 }
2malloc和new的区别
1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main() 5 { 6 int *p=new int[10]; 7 p[0]=1; 8 delete p; 9 p=NULL; 10 11 int *p1=(int *)malloc(sizeof(int)*10); 12 p1[0]=2; 13 cout << p1[0] << endl; 14 free(p1); 15 16 return 0; 17 }
3字符串和数组的几个小知识
1 string str="hello"; 2 char arr[30]; 3 strcpy(arr,str.c_str());//字符串变字符数组 4 5 strlen(arr1)//求字符数组的长度 6 str.length();//求字符串的长度 7 sizeof(arr2)/sizeof(int);//求整数数组的长度 8 9 *max_element(array,array+n)//求数组里面的最大值是谁,不改变数组 10 *min_element(array,array+n)//求数组里面的最小值是谁,不改变数组 11 12 reverse(str.begin(),str.end());//反转字符串 13 14 reverse(arr,arr+n); 15 puts(arr);//反转数组 16 17 srand((unsigned)time(NULL)); 18 rand()%10;//产生随机数、 19 20 bool cmp(int a,int b){ 21 return a>b; 22 } 23 sort(a,a+n,cmp)//从大到大小排序 24 25 void func(int **array,int m,int n){} <==> void func(int array[][],int m,int n){}
4两种全排列算法(排列的结果的顺序不同)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int num1=0; 4 int num2=0; 5 void Swap(int &a,int &b){ 6 int temp; 7 temp=b; 8 b=a; 9 a=temp; 10 } 11 12 void perm(int array[],int k,int m){ 13 if(k==m){ 14 for(int i=0;i<=m;i++){ 15 cout << array[i] << " "; 16 } 17 cout << endl; 18 num1++; 19 } 20 else{ 21 for(int i=k;i<=m;i++){ 22 Swap(array[k],array[i]); 23 perm(array,k+1,m); 24 Swap(array[k],array[i]); 25 } 26 } 27 } 28 29 int main() 30 { 31 int array[10]={3,2,1,5,6,7,8,9,4,0}; 32 sort(array,array+sizeof(array)/sizeof(int)); 33 perm(array,0,4);//方法一:自定义排序函数 34 cout << "0~4的全排列总有" << num1 << "种" << endl; 35 cout << "----------------------------------------------------------------" << endl; 36 do{ 37 for(int i=0;i<5;i++){ 38 cout << array[i] << " "; 39 } 40 num2++; 41 cout << endl; 42 }while(next_permutation(array,array+5));//方法二:使用next_permutation(array,array+n);实现排序 43 cout << "0~4的全排列总有" << num2 << "种" << endl; 44 return 0; 45 }
5二分查找
1 #include <bits/stdc++.h>
2 using namespace std;
3 int binarysearch(int array[],int x,int n){
4 int left=0;
5 int right=n-1;
6 while(left<right){
7 int middle=(left+right)/2;
8 if(array[middle]==x) return middle;
9 if(array[middle]<x) left=middle+1;
10 if(array[middle]>x) right=middle-1;
11 }
12 return -1;
13 }
14 int main()
15 {
16 int array[10]={3,2,1,5,6,7,8,9,4,0};
17 sort(array,array+10);
18 int a=binarysearch(array,10,sizeof(array)/sizeof(int));
19 if(a==-1) cout << "没找到" << endl;
20 else cout << "找到该数字,在顺序排列后的数组的下标为" << a<< endl;
21 return 0;
22 }
6合并排序
1 template<class Type> 2 void MergeSort(Type a[],int left,int right) 3 { 4 if(left<right){//至少有两个元素 5 int i=(left+right)/2;//取中点 6 MergeSort(a,left,i); 7 MergeSort(a,i+1,right); 8 Merge(a,b,left,i,right);//合并到数组b 9 Copy(a,b,left,right);//复制回数组a 10 } 11 }
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 template<class Type> 5 int Merge(Type a[],Type c[],int l,int m,int r){ 6 int i=l; 7 int j=m+1; 8 int k=0; 9 while((i<=m) && (j<=r)){ 10 if(a[i]<=a[j]) c[k++]=a[i++]; 11 if(a[i]>a[j]) c[k++]=a[j++]; 12 13 } 14 if(i<=m) 15 { 16 for(int q=i;q<=m;q++){ 17 c[k++]=a[q]; 18 } 19 } 20 if(j<=r){ 21 for(int q=j;q<=r;q++){ 22 c[k++]=a[q]; 23 } 24 } 25 return 1; 26 } 27 template<class Type> 28 int MergeSort(Type a[],Type b[],int left,int right){ 29 if(left<right){ 30 int i=(left+right)/2; 31 MergeSort(a,b,left,i); 32 MergeSort(a,b,i+1,right); 33 Merge(a,b,left,i,right); 34 } 35 } 36 int main() 37 { 38 int a[12]={1,3,5,7,9,2,4,6,8,10,12,14}; 39 int b[12]; 40 MergeSort(a,b,0,11); 41 for(int i=0;i<=11;i++){ 42 cout << b[i] << " "; 43 } 44 return 0; 45 }
7快排
1 #include <bits/stdc++.h> 2 using namespace std; 3 void Swap(int &a,int &b) 4 { 5 int temp; 6 temp=a; 7 a=b; 8 b=temp; 9 } 10 11 int Partition(int a[],int p,int r) 12 { 13 int i=p; 14 int j=r+1; 15 int x=a[p]; 16 while(true){ 17 while(a[++i] < x && i<r); 18 while(a[--j] > x); 19 if(i>=j) break; 20 Swap(a[i],a[j]); 21 } 22 a[p]=a[j]; 23 a[j]=x; 24 return j; 25 } 26 void QuickSort(int a[],int p,int r) 27 { 28 if(p<r){ 29 int q=Partition(a,p,r); 30 QuickSort(a,p,q-1); 31 QuickSort(a,q+1,r); 32 } 33 } 34 int main() 35 { 36 int array[10]={0,5,2,7,9,1,3,4,6,8}; 37 QuickSort(array,0,9); 38 for(int i=0;i<10;i++){ 39 cout << array[i] << " "; 40 } 41 return 0; 42 }
8半数集
1 long f(int n){ 2 long sum=1; 3 if(a[n]>0) return a[n]; 4 5 for(int i=1;i<=n/2;i++){ 6 sum += f(i); 7 } 8 a[n]=sum; 9 return sum; 10 }
9集合划分
1 int f(int n,int m) 2 { 3 if(n==1) return 1;//只有一个集合 4 if(m==m) return 1;//每个元素一个集合 5 else{ 6 return m*f(n-1,m)+f(n-1,m+1);//向n-1个元素划分的m个集合里添加一个新元素,有m*f(n-1,m)种, 7 } //向n-1个元素划分的m个集合里添加一个独立元素,有f(n-1,m+1)种, 8 9 }
10整数因子分解问题
1 void f(n) 2 { 3 if(n==1) num+=1; 4 for(int i=2;i<=n;i++){ 5 if(n%2==0) f(n%i); 6 } 7 }
11利用二分法求最大值
1 #include<bits/stdc++.h> 2 using namespace std; 3 int getMax(int array[],int begin,int end) 4 { 5 if(begin==end) return array[end]; 6 int mid=(begin+end)/2; 7 int max1=getMax(array,begin,mid); 8 int max2=getMax(array,mid+1,end); 9 return max1>max2?max1:max2; 10 } 11 int main() 12 { 13 int array[15]={18,1,3,5,7,9,7,5,3,4,11,44,5,3}; 14 cout << getMax(array,0,13); 15 return 0; 16 }
12二叉树遍历(递归)
1 typedef struct node //定义二叉树的结点 2 { int data; //结点的数据 3 struct node*lChild,*rChild; //结点左右孩子 4 }Node; 5 void inOrder(Node *root) //中序遍历 6 { 7 if(root!=0) //如果根节点不为0 8 { 9 inOrder(root->lChild); //指向左孩子 10 printf("%d ",root->data); //打印当前结点 11 inOrder(root->rChild); //指向右孩子 12 } 13 }
13最大字段和
1 int MaxSum(int n,int a[]) 2 { 3 int sum = 0; 4 int b = 0; 5 for(int i = 1; i <= n; i++) 6 { 7 if(b > 0) 8 b += a[i]; 9 else 10 b = a[i]; 11 if(b > sum) 12 sum = b; 13 } 14 return sum; 15 }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~不断更新中。