简单高精度的加减乘除以及vector的基本基本用法

高精度:解决上百位数的计算

< vector>的一些简单 用法

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

int main()
{
	vector<int> v(5,1);//表示v里面含有5个元素且全为1 ; 
	vector<int> a;
	for(int i=0;i<5;i++)
	{
		a.push_back(i);//把i的值当作a中最后一位元素的值; 
	}
	cout<<a.front()<<" ";//返回a中第一个元素的值 
	cout<<a.back();//返回a中最后一个元素的值
	a.clear();//将a中所有元素清空
	cout<<a.empty()//判断a中是否含有元素 没有返回true否则false 
	return 0; 
}

高精度加法代码

//高精度 
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

vector<int> add(vector<int> &A,vector<int> &B)//使用引用变量 
{
	vector<int> C;
	if(A.size()<B.size()) return add(B,A);//让A的长度大于B的长度 
	int t=0;
	for(int i=0;i<A.size();i++)
	{
		t+=A[i];
		if(i<B.size())t+=B[i];//让A与B的值加一起 
		C.push_back(t%10);//进位 
		t/=10; 
	}
	if(t)C.push_back(1);//如果t不为o说明t/=10之后还有进位 
	return C;
}

int main()
{
	string a,b;
	vector<int> A,B;//储存a,b的值 
	cin>>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 = add(A,B);
	
	for(int i=C.size()-1;i>=0;i--)//逆序输出 
	cout<<C[i];
}

利用高精度解决较大的斐波那契数列

Q:楼梯有 NN 阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。
A:(利用二维数组来实现高精度的思路)

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 5010;

int f[N][N],n,len=1;

void fb(int n)
{
	for(int i=1;i<=len;i++)
	f[n][i]=f[n-1][i]+f[n-2][i];
	for(int i=1;i<=len;i++)
	{
		if(f[n][i]>=10)
		{
			f[n][i+1]+=f[n][i]/10;
			f[n][i]=f[n][i]%10;
			if(f[n][len+1]!=0)len++;
		}	
	}
}

int main()
{
	cin>>n;
	f[1][1]=1;
	f[2][1]=2;
	for(int i=3;i<=n;i++)
	fb(i);
	for(int i=len;i>=1;i--)
	{
		cout<<f[n][i];
	}
	return 0;	
}

高精度减法(两正整数相减)


```cpp
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

bool cmp(vector<int> &A,vector<int> &B) 
{
	if(A.size()!=B.size())return A.size()>B.size();//如果A,B的长度不相等返回判断A是否比B长 
	for(int i=A.size()-1;i>=0;i--)//如果长度相等从最高位开始比较 
	{
		if(A[i]!=B[i])// 如果不等 返回判断A[i]是否大于B[i] 
		return A[i]>B[i];
	}
	return true;//此时说明A,B是相等的 
}

vector<int> sup(vector<int> &A,vector<int> &B)
{
	vector<int> C;
	for(int i=0,t=0;i<A.size();i++)
	{
		 t=A[i]-t;
		 if(i<B.size())t=t-B[i];//判断i是否大于B的长度 
		 C.push_back((t+10)%10);
		 /*此时应该分两种情况
		  1.如果t<0,说明A[i]小于b[i],应该借位 C[i]应该等于A[i]+10-B[i]; 
		  2.如果t>=0,说明A[i]大于b[i],(t+10)%10==t;
		  综上所述 无论 那种情况都可以有t+10)%10; 
		  */
		 if(t<0)//t<0,接下来要借位 
		 t=1;
		 else 
		 t=0;
	}
	while(C.size()>1&&C.back()==0) C.pop_back();//去掉前导0,如123-120会有003; 
	return C;
}

int main()
{
	string a,b;
	vector<int> A,B;
	cin>>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');
	
	if(cmp(A,B))//判断A和B的大小,那大的减去小的,如果换位则多输出一个负号 
	{
		vector<int> C = sup(A,B);
		for(int i=C.size()-1;i>=0;i--)cout<<C[i];
	}
	else
	{
		vector<int> C=sup(B,A);
		cout<<"-";
		for(int i=C.size()-1;i>=0;i--)cout<<C[i];
	}
	return 0;

 } 

```
高精度乘法

#include
#include
#include

using namespace std;

//高精度乘法模板

那一个很大的数(上百位)的数与一个较小的数相乘
vector<int> mul(vector<int> &A,int b)
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size()||t;i++)//类似与高精度的加法 二者可以相互印证 
    {
        if(i<A.size())t+=A[i]*b;
        C.push_back(t%10);
        t=t/10;
    }
    
    while(C.size()>1&&C.back()==0)C.pop_back();//去掉后导0 
    
    return C;
}

int main()
{
    string a;
    vector<int> A;
    int b;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    vector<int> C=mul(A,b); 
    
    for(int i=C.size()-1;i>=0;i--)
    cout<<C[i];
    return 0;
}

除法的高精度

//那一个特别大的数除以一个较小的数
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

vector<int> div(vector<int> &A,int b,int &r)//r用引用变量来使用 
{
    vector<int> C;
    
    for(int i=A.size()-1;i>=0;i--)//算法核心 
    {
        r=r*10+A[i];
        C.push_back(r/b);
        r=r%b;
    }
    
    reverse(C.begin(),C.end());//将字符串逆序 
    
    while(C.size()>1&&C.back()==0) C.pop_back();
    
    return C;
}

int main()
{
    string a;
    int b,r;
    vector<int> A;
    
    cin>>a>>b;
    
    for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
    //在高精度除法中 应该从最高位开始计算,储存时正序储存更方便 
	//都是高精度计算都是混合运算,为了统一在这里也逆序储存 
    vector<int> C=div(A,b,r);
    
    for(int i=C.size()-1;i>=0;i--)cout<<C[i];
    
    cout<<endl<<r<<endl;
    
    return 0;
    
}

 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值