c++算法总结

最大公因数:

时间复杂度是 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} n1018

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值