小技巧总结

来源:互联网 发布:java python 数据分析 编辑:程序博客网 时间:2024/05/11 03:38

快速读入一行字符串中的数字
(比如3 2 1 4 5 7 6)

#include <iostream>#include <sstream>using namespace std;int a[1000];bool read_list(){        string line;        if(!getline(cin,line)) return false;        stringstream ss(line);        int n=0;        int x;        while(ss >> x) a[n++]=x;        return n>0;}

sort的使用在中定义

bool cmp(int a,int b){  return a<b; //升序排列,如果改为return a>b,则为降序}int _tmain(int argc, _TCHAR* argv[]){  int a[20]={2,4,1,23,5,76,0,43,24,65},i;  for(i=0;i<20;i++)  cout<<a[i]<<endl;  sort(a,a+20,cmp);//若是只是想得到a[20]()不包括a[20]内所有元素的升序排序,那么只需要sort(a,a+20)即可  for(i=0;i<20;i++)  cout<<a[i]<<endl;  return 0;}

qsort的使用在

int compare(const void *a,const void *b){  return *(int*)b-*(int*)a;   }int main(){  int a[20]={2,4,1,23,5,76,0,43,24,65},i;  for(i=0;i<20;i++)  cout<<a[i]<<endl;  qsort((void *)a,20,sizeof(int),compare);  for(i=0;i<20;i++)  cout<<a[i]<<endl;  return 0;}解释: qsort ( 数组名 ,元素个数,元素占用的空间(sizeof),比较函数)比较函数是一个自己写的函数 遵循 int com(const void *a,const void *b) 的格式。当a b关系为 > < = 时,分别返回正值 负值 零 (或者相反)。使用a b 时要强制转换类型,从void * 转换回应有的类型后,进行操作。数组下标从零开始,个数为N, 下标0-(n-1)。实例:int compare(const void *a,const void *b){  return *(int*)b-*(int*)a;   }int main(){  int a[20]={2,4,1,23,5,76,0,43,24,65},i;  for(i=0;i<20;i++)  cout<<a[i]<<endl;  qsort((void *)a,20,sizeof(int),compare);  for(i=0;i<20;i++)  cout<<a[i]<<endl;  return 0;}

实现高进制的数向低进制的数的转换

void (int n,int pal){    int num=0;    int a[50]={0};    while(n){        a[num++]=n%pal;        n/=pal;    }    //注意此时num的值就是转换过后新的数的位数,然后从a[0]~a[num-1]都是他的低到高的位数}

ios中round/ceil/floorf函数的使用

extern float ceilf(float);extern double ceil(double);extern longdouble ceill(longdouble);extern float floorf(float);extern double floor(double);extern longdouble floorl(longdouble);extern float roundf(float);extern double round(double);extern longdouble roundl(longdouble);round:如果参数是小数,则求本身的四舍五入。ceil:如果参数是小数,则求最小的整数但不小于本身.floor:如果参数是小数,则求最大的整数但不大于本身. Example:如何值是3.4的话,则3.4 -- round 3.000000    -- ceil 4.000000    -- floor 3.00000CGRectMake(floorf(self.view.bounds.size.width*0.5f - 39.f*0.5f),self.view.bounds.size.height -57, 39, 39)其中floorf(self.view.bounds.size.width*0.5f -39.f*0.5f)返回值为140.000000这种形式

排序数列的二分查找

int _binary_search(int arr[],int low,int high,int key){        int mid=low+(high-low)/2;        if(low>high)                return -1;        else{                if(arr[mid]==key)                        return mid;                else if(arr[mid]>key)                        return _binary_search(arr,low,mid-1,key);                else                        return _binary_search(arr,mid+1,high,key);        }}

DFS实现简单的某个区间内的所有数字的全排列

#include <cstdio>#include <iostream>using namespace std;int perm[100];int used[100];//实现[b,n]区间内所有数字的全排列void permutation(int pos,int b,int n){        if(pos==(n-b+1)){//注意n这个数字是永远不输出的                for(int i=0;i<=n-b;i++)                        printf("%d ",perm[i]);                cout << endl;                return;        }        else{                for(int i=b;i<=n;i++){                        if(used[i]==0){//如果i这个数字没被用过                                used[i]=1;                                perm[pos]=i;                                permutation(pos+1,b,n);                                used[i]=0;                        }                }                return;        }}int main(){        permutation(0,100,109);        return 0;}

埃式筛法打素数表

#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <cmath>using namespace std;const int maxn=100000 + 10;int main(){        int n;        while(scanf("%d",&n)==1){                int prime[maxn],p=0;                bool is_prime[maxn];                memset(prime,0,sizeof(prime));                memset(is_prime,true,sizeof(is_prime));                is_prime[0]=is_prime[1]=false;                for(int i=2;i<=n;i++){                        if(is_prime[i]){                                prime[p++]=i;                                for(int j=i*2;j<=n;j+=i){                                        is_prime[j]=false;                                }                        }                }                cout<<n<<"以内的素数的个数为"<<p<<endl;                for(int i=0;i<p;i++){                        cout << prime[i] << endl;                }        }        return 0;}

矩阵的行与列频繁交换后的查询

需要知道的是一个矩阵先进行行的交换还是列的交换其实顺序并不会影响结果。并且假设只进行行的交换,那么其实最后只是把tr[x]x行进行交换即可,tr[x]表示x行应该是tr[x]行整体移过来的,所以只需要在查询的时候再查找tr[x]行与tc[y]列的值即是所求

两数模后相减变成负数

遇见这样的情况,明明前一个数比后一个数大,但是由于前后两个数模同一个数后前面的数反而比后面的数小了,这样在对两个数的差模就是一个负数了,所以这里有一个小技巧就是(a - b + MOD)%MOD,这样就能保证得到的一定是一个正数了

判断一个数是否为素数

bool is_prime(ll n){        for(ll i=2;i*i<=n;i++)                if(n%i==0) return false;        return n!=1;}

简便处理(a/c)%mod的方法

(a/c)%mod=a%(mod*c)/c;

列举{0,1,2,………n-1}的所有子集的方法

其实这句话可以转化为集合中的每一个元素出现与否的情况组合起来就是我们想要的结果了。所以for(int i=0;i< 1<<n ;i++){    for(int j=0;j<n;j++)        a[j]=i>>j & 1;}

输出13个字符的非四舍五入类型的保留n位小数的浮点数

printf("%13.2lf",(int)(n*100)/100.0);

设置随机数
博客链接

在有序数组a中寻找值为k的数的个数
这里写图片描述

求一个n长的数组中k个连续元素的和的问题可以用区间头+1,区间尾-1的方式将问题的复杂度从O(nk)降低到O(n)的程度。而尺取法可以将一个n长的数组中某个和大于等于s的区间算出来,复杂度也是O(n)

约瑟夫环转移方程

下一个人的位置 = ( (当前出局的人的位置+他手中的密码)%剩下的总人数 + 剩下的总人数 -1 )% 剩下的总人数 (手中的密码大于0时)
下一个人的位置 = ( (当前出局的人的位置+他手中的密码)%剩下的总人数 + 剩下的总人数 )% 剩下的总人数 (手中的密码小于0时)
原理就是(当前出局的人的位置+他手中的密码)%剩下的总人数是一个有规律的序列,我们只需要找到这个序列与0,1,2….n-1之间的关系即可

0 0
原创粉丝点击