前言:写这篇博客完全是给自己当做笔记用的,考虑到自己的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=;
  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)*/PI;
  22. }
  23. //求弧长
  24. double huChang(double r,double jiaodu){
  25. double huDu=jiaodu*3.1415926/;
  26. return huDu*r;
  27. }
  28. int main()
  29. {
  30. int n=;
  31. cout << "请输入三个点的坐标" << endl;
  32. Point point[];
  33. for(int i=;i<=n;i++){
  34. cin >> point[i].x;
  35. cin >> point[i].y;
  36. }
  37.  
  38. cout << "向量BA的长度为" << setiosflags(ios::fixed) << setprecision()<<computeLength(point[],point[]) << endl;
  39. cout << "向量BC的长度为" << setiosflags(ios::fixed) << setprecision()<<computeLength(point[],point[]) << endl;
  40. double a=jiaoDu(point[],point[],point[]);
  41. cout << "角ABC的大小为为" << setiosflags(ios::fixed) << setprecision()<<jiaoDu(point[],point[],point[]) << endl;
  42. return ;
  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[];
  7. p[]=;
  8. delete p;
  9. p=NULL;
  10.  
  11. int *p1=(int *)malloc(sizeof(int)*);
  12. p1[]=;
  13. cout << p1[] << endl;
  14. free(p1);
  15.  
  16. return ;
  17. }

3字符串和数组的几个小知识

  1. string str="hello";
  2. char arr[];
  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()%;//产生随机数、
  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=;
  4. int num2=;
  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=;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+,m);
  24. Swap(array[k],array[i]);
  25. }
  26. }
  27. }
  28.  
  29. int main()
  30. {
  31. int array[]={,,,,,,,,,};
  32. sort(array,array+sizeof(array)/sizeof(int));
  33. perm(array,,);//方法一:自定义排序函数
  34. cout << "0~4的全排列总有" << num1 << "种" << endl;
  35. cout << "----------------------------------------------------------------" << endl;
  36. do{
  37. for(int i=;i<;i++){
  38. cout << array[i] << " ";
  39. }
  40. num2++;
  41. cout << endl;
  42. }while(next_permutation(array,array+));//方法二:使用next_permutation(array,array+n);实现排序
  43. cout << "0~4的全排列总有" << num2 << "种" << endl;
  44. return ;
  45. }

5二分查找

  1. 1 #include <bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 int binarysearch(int array[],int x,int n){
  4. 4 int left=0;
  5. 5 int right=n-1;
  6. 6 while(left<right){
  7. 7 int middle=(left+right)/2;
  8. 8 if(array[middle]==x) return middle;
  9. 9 if(array[middle]<x) left=middle+1;
  10. 10 if(array[middle]>x) right=middle-1;
  11. 11 }
  12. 12 return -1;
  13. 13 }
  14. 14 int main()
  15. 15 {
  16. 16 int array[10]={3,2,1,5,6,7,8,9,4,0};
  17. 17 sort(array,array+10);
  18. 18 int a=binarysearch(array,10,sizeof(array)/sizeof(int));
  19. 19 if(a==-1) cout << "没找到" << endl;
  20. 20 else cout << "找到该数字,在顺序排列后的数组的下标为" << a<< endl;
  21. 21 return 0;
  22. 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)/;//取中点
  6. MergeSort(a,left,i);
  7. MergeSort(a,i+,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+;
  8. int k=;
  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 ;
  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)/;
  31. MergeSort(a,b,left,i);
  32. MergeSort(a,b,i+,right);
  33. Merge(a,b,left,i,right);
  34. }
  35. }
  36. int main()
  37. {
  38. int a[]={,,,,,,,,,,,};
  39. int b[];
  40. MergeSort(a,b,,);
  41. for(int i=;i<=;i++){
  42. cout << b[i] << " ";
  43. }
  44. return ;
  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+;
  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-);
  31. QuickSort(a,q+,r);
  32. }
  33. }
  34. int main()
  35. {
  36. int array[]={,,,,,,,,,};
  37. QuickSort(array,,);
  38. for(int i=;i<;i++){
  39. cout << array[i] << " ";
  40. }
  41. return ;
  42. }

8半数集

  1. long f(int n){
  2. long sum=;
  3. if(a[n]>) return a[n];
  4.  
  5. for(int i=;i<=n/;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==) return ;//只有一个集合
  4. if(m==m) return ;//每个元素一个集合
  5. else{
  6. return m*f(n-,m)+f(n-,m+);//向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==) num+=;
  4. for(int i=;i<=n;i++){
  5. if(n%==) 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)/;
  7. int max1=getMax(array,begin,mid);
  8. int max2=getMax(array,mid+,end);
  9. return max1>max2?max1:max2;
  10. }
  11. int main()
  12. {
  13. int array[]={,,,,,,,,,,,,,};
  14. cout << getMax(array,,);
  15. return ;
  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
  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 = ;
  4. int b = ;
  5. for(int i = ; i <= n; i++)
  6. {
  7. if(b > )
  8. b += a[i];
  9. else
  10. b = a[i];
  11. if(b > sum)
  12. sum = b;
  13. }
  14. return sum;
  15. }

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~不断更新中。

c++常考算法知识点汇总的更多相关文章

  1. 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token

    为什么你学不会递归?告别递归,谈谈我的一些经验   可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! ...

  2. BFS与DFS常考算法整理

    BFS与DFS常考算法整理 Preface BFS(Breath-First Search,广度优先搜索)与DFS(Depth-First Search,深度优先搜索)是两种针对树与图数据结构的遍历或 ...

  3. Leetcode——二叉树常考算法整理

    二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...

  4. C++常考面试题汇总

    c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...

  5. C++常考面试题汇总(持续更新中)

    c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...

  6. Mybatis常考面试题汇总(附答案)

    1.#{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是预编译处理,${}是字 ...

  7. C++常考算法

    1 strcpy, char * strcpy(char* target, char* source){  // 不返回const char*, 因为如果用strlen(strcpy(xx,xxx)) ...

  8. Linux命令面试常考的简单汇总

    1.显示日期与时间的命令:date 2.显示日历的命令:cal 3.简单好用的计算器:bc 4.热键“命令补全或文件补齐”:Tab 5.热键“中断目前程序”:Ctrl+C 6.热键“键盘输入结束(En ...

  9. .NET面试常考算法

    1.求质数    质数也成为素数,质数就是这个数除了1和他本身两个因数以外,没有其他因数的数,叫做质数,和他相反的是合数,    就是除了1和他本身两个因数以外,还友其他因数的数叫做合数. 1 nam ...

随机推荐

  1. Linux vi/vim使用方法

    vi/vim 基本使用方法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令. 1.vi的基本概念 基本上vi ...

  2. Chrome_01_点击 Google搜索结果在新的页面打开

    方法一:Ctrl + 左键 Chrome浏览器中,通过 Ctrl + 左键 ,是在新标签中打开的,通过 Shift + 左键 ,是在新窗口中打开的. 方法二: 1.登录 Google 2.进入下面的设 ...

  3. 2.4 AppDelegate 的 3 个生命周期

    Classed/AppDelegate.cpp 文件内容如下: #include "cocos2d.h" #include "CCEGLView.h" #inc ...

  4. c/c++写的比较好的读写配置文件的函数或者类

    共用版  .h文件 //---------------------------------------------------------------------------- // 程序名称:    ...

  5. bzoj 3165: [Heoi2013]Segment 线段树

    题目: Description 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第i条被插入的线段的标号为i. 给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. ...

  6. Fortify代码扫描解决方案

    Fortify扫描漏洞解决方案: Log Forging漏洞: 1.数据从一个不可信赖的数据源进入应用程序. 在这种情况下,数据经由getParameter()到后台. 2. 数据写入到应用程序或系统 ...

  7. fastjson 使用笔记

    1.string转json String params={'key1':'50001','key2':10007700'}Map<String, String> a = JSON.pars ...

  8. js基础之变量类型

    1.NAN(Not a number) 不是一个数字 自身:console.log(NaN==NaN)和console.log(NaN===NaN)返回值都是false; 其他函数,isNaN()可用 ...

  9. UML核心元素--包

    包是一种容器,如同文件夹一样,将某些信息分类,形成逻辑单元.包可以容纳任何UML元素,例如用例.业务实体.类图等,也包括子包. 一.分包原则: (1)高内聚:被分入同一个包的元素相互联系紧密,伸至不可 ...

  10. 通过 命令提示符(cmd.exe)连接 Oracle 数据库

    通过IP 连接数据库: sqlplus userName/userPassword@//IP:port/SID 例:sqlplus testuser/123456@//192.168.0.1:1521 ...