栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++高精度一系列的算法(包含阶乘求和)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++高精度一系列的算法(包含阶乘求和)

高精度运算 一、高精度加减高精度以及高精度乘低精度。
#include 
#include                        //使用了vector动态数组的方法来实现。
#include 
using namespace std;
vector add(vector A, vector B)
{
    cout << "高精度加法运算:n";
    if (A.size() < B.size())
        return add(B, A);          //要保证用更长的一个数组来完成整个循环。
    vectorC; int t=0;
    for (int i = 0; i < A.size(); i++)
    {
        t += A[i];
        if (i < B.size())
            t +=B[i];
        C.push_back(t % 10);
            t /= 10;
    }
    if (t)                  //注意这一步if判断,在高精度减法中就不用这一步。
        C.push_back(t);
    while (C.size() >= 1&& C.back() == 0)           //清除前置零
        C.pop_back();                               //和push_back配套使用。
    for (int i = C.size() - 1; i >= 0; i--)
    {
        cout << C[i];
    }
    cout << endl;
    return C;
}
vector mul(vectorA, vectorB)
{
    cout << "高精度减法运算:n";
    if (A.size() < B.size())
        return mul(B, A);                   //保证用长的减短的。
    vectorC; int t = 0;
    for (int i = 0; i < A.size(); i++)
    {
        t = A[i] - t;
        if (i < B.size())
            t -= B[i];
        C.push_back((t + 10) % 10);
        if (t < 0)                              //这步判断是跟高精度加法不一样的地方。
            t = 1;
        else
            t = 0;
    }
    
    while (C.size() >1 && C.back()==0)              //同样是为了清除前置零。
        C.pop_back();
    for (int i = C.size() - 1; i >= 0; i--)
    {
        cout << C[i];
    }
    cout << endl;
    return C;
}
vector solve(vectorA, int x)
{
    cout << "高精度乘低精度:n";
    vectorC;
    int t=0;
    for (int i = 0; i < A.size(); i++)
    {
        t+= A[i]*x ;                    //挨个乘。
        C.push_back(t % 10);
        t /= 10;
    }
    if (t)
        C.push_back(t);
    while (C.size() > 1 && C.back() == 0)
    C.pop_back();
    for (int i = C.size() - 1; i >=0 ; i--)             //注意一下for循环的条件。
    {
        cout << C[i];
    }
    cout << endl;
    return C;
}
int main()
{
    vectorA, B;
    string a, b;
    cin >> a >> b;
    for (int i=0;i= 0; i--)
    {
        B.push_back(b[i] - '0');
    }
    add(A, B);
    mul(A, B);
    solve(A, 9);
    system("pause");
    return 0;
}
二、高精度乘高精度。
#include 
#include 
using namespace std;
int a[100], b[100], c[100];				//目的是为了将string类型转化为int类型存在数组中。
int main()
{
	string A, B;
	cin >> A >> B;
	for(int i =0;i= 0; i--)
	{
		cout << c[i];
	}
	cout << endl;

	system("pause");
	return 0;
}
三、高精度阶乘
#include 
#define Max 100
using namespace std;
struct BigInt
{
	int len;		//;len用来记录长度;
	int a[Max];		//用来存储数据。
	BigInt(int x = 0)
	{
		memset(a, 0, sizeof(a));			//用来初始化数组。
		for (len = 1; x; len++)
		{
			a[len] = x % 10;
			x /= 10;
		}
	}
	int& operator[](int i)					//重载运算符[]为了方便定义的对象使用下标法访问
	{
		return a[i];
	}
	void flatten(int n)					//一个展平函数,非常好用,这样就可以不用单独处理*和+后的结果的了。
	{
		len = n;
		for (int i = 1; i <= n; i++)
		{
			a[i + 1] += a[i] / 10;
			a[i] %= 10;
		}
		for (; !a[len];)
			len--;
	}
	void print()			//打印结果函数。
	{
		for (int i = len; i >= 1; i--)				//这里注意一下为什么i不是>=0以为数组里面的下标是从1开始存储的。
		{
			cout << a[i];
		}
	}
};
BigInt operator+(BigInt A, BigInt B)			//运算符重载
{
	BigInt C;
	int h = max(A.len, B.len);
		for (int i = 1; i <= h; i++)
		{
			C[i] = A[i] + B[i];
		}
	C.flatten(h + 1);					//+1因为加法运算进位最多为1;
	return C;
}
BigInt operator* (BigInt A, int h)
{
	BigInt C;
	int k = A.len;
	for (int i = 1; i <= k; i++)
	{
		C[i] = A[i] * h;
	}
	C.flatten(k + 11);						//这里加11是为一个int类型的数据最长为10位,如果是十位可能产生一位进位,保险起见。
	return C;
}
int main()
{
	int m;
	cin >> m;
	BigInt ans(0), fac(1);					//ans(0)用于加法运算,fac(1)用来挨个乘。
	for (int i = 1; i <= m; i++)
	{
		fac = fac * i;				
		ans = ans + fac;
	}
	ans.print();

	system("pause");
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429868.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号