挑战,用4种方法做a+b问题

本文介绍了C++中实现基础算术运算的直接方法,以及使用字符串处理高精度计算的方法。还展示了Dijkstra算法和Prim算法用于解决最短路径问题和最小生成树问题的应用。
摘要由CSDN通过智能技术生成

(1)直接方法

#include <bits/stdc++.h>
using namespace std;
int main(){
    int a,b;
    cin>>a>>b;
    cout<<a+b;
    return 0;
}

(2)高精度方法,就是模拟竖式的过程,一般用数组进行,可是我胆小包天,直接不转存了,干脆用字符串做。

#include <bits/stdc++.h> 
#define MP make_pair
#define ll long long
#define pa pair<int,int>
#define all_que pa,vector<pa >,greater<pa >
#define p_qw priority_queue<all_que >
using namespace std;
const int N=2e3+7,INF=2e9+1;
string HPA(string a,string b){
	reverse(a.begin(),a.end()); 
	reverse(b.begin(),b.end());
	string c(max(a.size(),b.size())+1,'0'); 
	for(int i=0;i<max(a.size(),b.size());i++){
    	if(i+1<=min(a.size(),b.size())){
    		int usa=a[i]-'0',usb=b[i]-'0';
    		if(usa+usb+(c[i]-'0')<10)c[i]+=(usa+usb);
    		else{
    			int uscs=c[i]-'0';
    			usa+=(usb+uscs);
    			c[i]=(usa%10)+'0';
    			c[i+1]+=usa/10;
			}
		}
	    else{
	    	int usc=c[i]-'0';
	    	if(a.size()>b.size())usc+=(a[i]-'0');
	    	else usc+=(b[i]-'0');
	    	c[i]=usc%10+'0';
	    	c[i+1]=usc/10+'0';
		}
	}
	reverse(c.begin(),c.end());
	string s=c.substr(1,c.size()-1); 
	if(c[0]=='0')return s;
	else return c; 
}
int main(){
    string a,b;
    cin>>a>>b;
    cout<<HPA(a,b);
    return 0;
}

(3)dijkstra,建一个图,3个顶点2个边,边权是a和b,求最远的两个点之间的最短距离。

#include <bits/stdc++.h>
#define ll long long
#define MP make_pair
#define pa pair<int,int>
#define dijk priority_queue
const int N=2e5+1;
using namespace std;
int d[N],x,y;
vector<int> a[N];
map<int,map<int,int> > cost;
void dijkstra(){
    memset(d,0x3f,sizeof(d));
	d[1]=0;
	dijk<pa, vector<pa>, greater<pa> > w;
	w.push(MP(0,1));
	while(!w.empty()){
		pa x=w.top();w.pop();
		ll rt=x.second;
		if(d[x.second]>=x.first)
		for(int i=0;i<a[rt].size();i++)
	    if(d[rt]+cost[rt][a[rt][i]]<d[a[rt][i]]){
	    	d[a[rt][i]]=d[rt]+cost[rt][a[rt][i]];
	    	w.push(MP(d[a[rt][i]],a[rt][i]));
		}
	}
}
int main(){
	cin>>x>>y;
	a[1].push_back(2);
	cost[1][2]=x;
	a[2].push_back(3);
	cost[2][3]=y;
	dijkstra();
	cout<<d[3];
    return 0;
}

(4)最小生成树算法。(由于prim自认为比较简单,所以这里用prim)

#include <bits/stdc++.h> 
#define MP make_pair
#define pa pair<int,int>
#define fift_que pa,vector<pa >,greater<pa >
#define p_qw priority_queue<fift_que >
using namespace std;
const int N=1e6+6,INF=2e9+1;
//不开long long见祖宗,数组开小见祖宗。 
//深搜不写终止条件见祖宗 
vector<int> G[N];
map<int,map<int,int > > cost;
int mincost[N],a,b;
bool used[N],th[N];
void add(int lx,int ly,int lz){
	G[lx].push_back(ly),G[ly].push_back(lx);
	cost[lx][ly]=lz;
	cost[ly][lx]=cost[lx][ly];
}
int prim(){
	int res=0; 
	p_qw w;
	w.push(MP(0,1));
	memset(mincost,0x3f,sizeof(mincost));
	mincost[1]=0;
	while(w.size()){
		pa tp=w.top();w.pop();
		int x=tp.second,y=tp.first;
		if(used[x]==1)continue;
		used[x]=1;
		res+=y;
		for(int i=0;i<G[x].size();i++){
			if(mincost[G[x][i]]>cost[x][G[x][i]]){
				mincost[G[x][i]]=cost[x][G[x][i]];
				w.push(MP(mincost[G[x][i]],G[x][i]));
			}
		}
	}
	return res;
}
int main(){
	cin>>a>>b;
	add(1,2,a);
	add(2,3,b);
	cout<<prim();
	return 0;
}

当然,方法还有很多,平方分割,线段树.....,我是个小学生,只有这么多啦。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值