最大公因数:
时间复杂度是 O ( n l o g ) O(nlog) O(nlog),可以用欧几里德算法(辗转相除法)
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
int a,b;
cin>>a>>b;
int r=a%b;
while(r!=0)
{
a=b;
b=r;
r=a%b;
}
cout<<b;
return 0;
}
排序
冒泡排序和插入排序时间复杂度是
O
(
n
2
)
O(n^2)
O(n2)
冒泡:
#include <iostream>
using namespace std;
int a[10010];
int main(int argc, char** argv) {
int n,sum=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=n-i;j++)
{
if(a[j]>a[j+1])
{
sum++;
swap(a[j],a[j+1]);
}
}
}
cout<<sum;
return 0;
}
计数排序:
#include <bits/stdc++.h>
using namespace std;
int a[1010];
int main(int argc, char** argy)
{
int n,sum=0,x;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
a[x]++;
if(a[x]==1) sum++;
}
cout<<sum<<'\n';
for(int i=1;i<=1000;i++)
{
if(a[i]>0) cout<<i<<" ";
}
return 0;
}
高精度
高精度加减乘除的时间复杂度一般是由位数来决定时间复杂度大小,位数是1000位的高精度时间复杂度是
O
(
(
l
o
g
n
)
2
)
O((logn)^2)
O((logn)2),位数是100000位的时间复杂度是
O
(
l
o
g
k
×
l
o
g
l
o
g
k
)
O(logk×loglogk)
O(logk×loglogk)(k表示位数).
加法:
#include <iostream>
#include <vector>
using namespace std;
vector<int> f[55];
vector<int> mul(vector<int> &a, int &b)
{
vector<int> c;
int t=0;
for(int i=0;i<a.size();i++)
{
t+=a[i]*b;
c.push_back(t%10);
t=t/10;
}
while(t!=0)
{
c.push_back(t%10);
t=t/10;
}
while(c.back()==0&&c.size()>1) c.pop_back();
return c;
}
vector<int> add(vector<int> &a,vector<int> &b)
{
if(a.size()<b.size()) return add(b,a);
vector<int> c;
int t=0;
for(int i=0;i<a.size();i++)
{
t+=a[i];
if(b.size()>i) t+=b[i];
c.push_back(t%10);
t=t/10;
}
if(t!=0) c.push_back(t);
while(c.size()>1&&c.back()==0) c.pop_back();
return c;
}
int main(int argc, char** argy)
{
int n,sum=0;
cin>>n;
vector<int> c;
c.push_back(1);
f[1].push_back(1);
for(int i=2;i<=n;i++)
{
f[i]=mul(f[i-1],i);
c=add(c,f[i]);
}
for(int i=c.size()-1;i>=0;i--) cout<<c[i];
return 0;
}
高精度乘法:
#include <iostream>
#include <vector>
using namespace std;
vector<int> mul(vector<int> &a, vector<int> &b)
{
vector<int> c;
c.assign(a.size()+b.size()-1,0);
for(int i=0;i<a.size();i++)
{
for(int j=0;j<=b.size();j++) c[i+j]+=a[i]*b[j];
}
for(int i=0;i<c.size()-1;i++)
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
while(c.size()>1&&c.back()==0) c.pop_back();
return c;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int> A,B;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
vector<int> C=mul(A,B);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
return 0;
}
二分查找
二分的时间复杂度是 O ( l o g n ) O(logn) O(logn), n ≤ 1 0 18 n≤10^{18} n≤1018
#include <bits/stdc++.h>
using namespace std;
int a[10000010];
int power_bound(int l,int r,int k)
{
while(l<r)
{
int mid=(l+r)/2;
if(a[mid]>=k) r=mid;
else l=mid+1;
}
if(a[l]==k) return l;
else return -1;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
while(m--)
{
int k;
cin>>k;
int l=power_bound(1,n,k);
cout<<l<<" ";
}
return 0;
}