#include<iostream>#include<cstdio>usingnamespace std;intcomm(int n,int k)// 求组合数{if(n < k)return0;elseif(k ==0|| n == k)return1;elsereturncomm(n -1, k)+comm(n -1, k -1);}intP(int n,int k)// 求排列数{if(n == k)return n;else{returnP(n -1, k)* n;}}intmain(){int n, k;
cin >> n >> k;printf("C(%d, %d) = %d\n",n,k,comm(n,k));printf("P(%d, %d) = %d\n",n,k,P(n,k));}
求最大公约数
#include<iostream>usingnamespace std;intgcd(int a ,int b){while(b){int t = a % b;
a = b;
b = t;}return a;}intmain(){int a,b;
cin >> a >> b;int ret =gcd(a,b);
cout << ret << endl;return0;}
求最小公倍数
#include<cstdio>intgcd(int a,int b){while(b){int t = a % b;
a = b;
b = t;}return a;}intlcm(int a,int b){int t = a * b;int t2 =gcd(a,b);return t/t2;}intmain(){int a,b;scanf("%d%d",&a,&b);int ret =lcm(a,b);printf("%d",ret);return0;}
判断是否回文数
#include<iostream>usingnamespace std;boolsymm(int x){int m = x, n =0;while(m){
n = n *10+ m %10;
m /=10;}return x == n;}intmain(){for(int i =11;i <=10000;i++){if(symm(i))cout << i << endl;}return0;}
或者可以开数组判断是否回文
#include<iostream>usingnamespace std;constint N =10000010;int a[N];boolsymm(int x){int m = x, n =0;while(m){
a[n++]= m %10;
m /=10;}for(int i =0;i < n;i++){if(a[i]!= a[n - i -1])returnfalse;}returntrue;}intmain(){for(int i =11;i <=10000;i++){if(symm(i))cout << i << endl;}return0;}
最朴素算法:判断是否素数(n * logn)
#include<iostream>usingnamespace std;boolisPrime(int x){if(x <=1)returnfalse;for(int i =2;i * i <= x;i++){if(x % i ==0)returnfalse;}returntrue;}intmain(){for(int i =1;i <=100;i++){if(isPrime(i))cout << i << endl;}return0;}
埃氏筛法判断素数 O(n*loglog)
constint N =10001;bool prime[N];// prime数组记录每个数是否合数 合数是false 素数是truevoidPrime(int x){memset(prime,true,sizeof prime);// 先初始化 所有数都是素数
prime[1]=false;for(int i =2; i * i <= x; i++){if(prime[i])// 如果是素数的话{for(int j =2; i * j <= x; j++){
prime[i * j]=false;// 那么所有素数的倍数都是合数}}}}
线性筛法求素数 O(n)
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>usingnamespace std;constint N =100000010;int cnt;int prime[N];bool st[N];bool pp[N];boolsymm(int x){int m = x, n =0;while(m){
n = n *10+ m %10;
m /=10;}return n == x;}intmain(){int a, b;scanf("%d%d",&a,&b);if(b >10000000) b =10000000;for(int i =2; i <= b; i++){if(!st[i])
prime[cnt++]= i,pp[i]=1;for(int j =0; j < cnt && prime[j]* i <= b; j++){
st[prime[j]* i]=true;if(i % prime[j]==0)break;}}for(int i = a; i <= b; i++){if(pp[i]&&symm(i))printf("%d\n", i);}return0;}
二分查找
#include<iostream>usingnamespace std;constint N =100010;int q[N];boolBinary_serach(int l,int r,int x){while(l < r){int mid = l + r >>1;if(q[mid]>= x)r = mid;else l = mid +1;}if(q[r]== x)returntrue;elsereturnfalse;}intmain(){int n,dest;
cin >> n >> dest;for(int i =0;i < n;i++)cin >> q[i];if(Binary_serach(0, n -1,dest))cout << dest << endl;else
cout <<-1<< endl;}
归并排序
include<iostream>#include<cstdio>usingnamespace std;constint N =100010;int q[N],w[N];voidmerge_sort(int l,int r){if(l >= r)return;int mid = l + r >>1;merge_sort(l, mid);merge_sort(mid +1, r);int i = l,j = mid +1,k =0;while(i <= mid && j <= r){if(q[i]<= q[j]) w[k++]= q[i++];else w[k++]= q[j++];}while(i <= mid)w[k++]= q[i++];while(j <= r)w[k++]= q[j++];for(int i = l, j =0;i <= r;i++,j++)q[i]= w[j];}intmain(){int n;scanf("%d",&n);for(int i =0;i < n;i++)scanf("%d",&q[i]);merge_sort(0, n -1);for(int i =0;i < n;i++)printf("%d ",q[i]);return0;}