高精度模拟

高精度加法:

#include<iostream>
#include<string>
#include <vector>
#include <algorithm>
#include<math.h>
#include<stack>//添加栈
#include<ctype.h>
#include<cstdlib>
#define pritnf printf
#define itn int
#define INF 10234567111
#define MAX 2000000
using namespace std;
#define  str  string 
#define  ll	  long long int 
#define  f	float	
#define ff  double
//字符串类型是string     ceil()向上取整,C++的正常逻辑是向下取整
int main() {
    //高精度加法
    //把数放到数组里面加法
    //  12
    //  39
    //  51
    //  50
    //  60
    //  110
    string n, m; //输入两个值
    cin >> n >> m;
    //按照倒数放到两个数组里
    int a[100] = { 0 }, b[100] = { 0 }, c[100] = { 0 };
    //倒序放入
    int len1 = n.size(), len2 = m.size();
    for (int i = 0; i < len1; ++i) a[i] = n[len1 - 1 - i] - '0';
    for (int i = 0; i < len2; ++i) b[i] = m[len2 - 1 - i] - '0';
    //相加放到结果数组c中
    int maxn = max(len1, len2);
    for (int i = 0; i < maxn; ++i) {
        c[i] += a[i] + b[i];//各个位相加    11,4
        c[i + 1] = c[i] / 10;
        c[i] %= 10;//如果有位置上大于10,就进位
    }
    //去掉前置0
    maxn++;
    while (c[maxn-1] == 0 && maxn > 1)  maxn--;
    //因为是逆序,所以需要倒着输出
    for (int i = maxn - 1; i >= 0; --i) cout << c[i];
    return 0;
}

高精度减法:

#include<iostream>
#include<string>
#include <vector>
#include <algorithm>
#include<math.h>
#include<stack>//添加栈
#include<ctype.h>
#include<cstdlib>
#define pritnf printf
#define itn int
#define INF 10234567111
#define MAX 2000000
using namespace std;
#define  str  string 
#define  ll	  long long int 
#define  f	float	
#define ff  double
//字符串类型是string     ceil()向上取整,C++的正常逻辑是向下取整
int main() {
    //高精度加法
    //把数放到数组里面加法
    //  12
    //  39
    //  51
    //  50
    //  60
    //  110
    string n, m; //输入两个值
    cin >> n >> m;
    //按照倒数放到两个数组里
    int a[100] = { 0 }, b[100] = { 0 }, c[100] = { 0 };
    //相减的话,找到较大数减去较小数会好算一点
    int flag = 0;
    //倒序放入
    int len1 = n.size(), len2 = m.size();
    if (len1 < len2 || len1 == len2 && atoi(n.c_str()) < atoi(m.c_str())){
        flag=1;
        swap(n,m);
    }//把n作为较大数
    for (int i = 0; i < len1; ++i) a[i] = n[len1 - 1 - i] - '0';
    for (int i = 0; i < len2; ++i) b[i] = m[len2 - 1 - i] - '0';
    //相加放到结果数组c中
    int maxn = max(len1, len2);
    for (int i = 0; i < maxn; ++i) {
        //如果小了,就找前面借
        if (a[i] < b[i]) {
            c[i] = a[i] + 10 - b[i];
            a[i + 1] = a[i + 1] - 1;
        }else{
            c[i] = a[i] - b[i];
        }
    }
    //去掉前置0
    maxn++;
    while (c[maxn-1] == 0 && maxn > 1)  maxn--;
    if (flag) cout << "-";//如果是负数就加一个负号
    //因为是逆序,所以需要倒着输出
    for (int i = maxn - 1; i >= 0; --i) cout << c[i];
    return 0;
}

高精度乘法:

#include<iostream>
#include<string>
#include <vector>
#include <algorithm>
#include<math.h>
#include<stack>//添加栈
#include<ctype.h>
#include<cstdlib>
#define pritnf printf
#define itn int
#define INF 10234567111
#define MAX 2000000
using namespace std;
#define  str  string 
#define  ll	  long long int 
#define  f	float	
#define ff  double
//字符串类型是string     ceil()向上取整,C++的正常逻辑是向下取整
int main() {
    //高精度加法
    //把数放到数组里面加法
    //  12
    //  39
    //  51
    //  50
    //  60
    //  110
    string n, m; //输入两个值
    cin >> n >> m;
    //按照倒数放到两个数组里
    int a[100] = { 0 }, b[100] = { 0 }, c[100] = { 0 };
    //相减的话,找到较大数减去较小数会好算一点
    int flag = 0;
    //倒序放入
    int len1 = n.size(), len2 = m.size();
    /*
    if (len1 < len2 || len1 == len2 && atoi(n.c_str()) < atoi(m.c_str())){
        flag=1;
        swap(n,m);
    }
    */
    //  41
    //   4
    // 164
    for (int i = 0; i < len1; ++i) a[i] = n[len1 - 1 - i] - '0';
    for (int i = 0; i < len2; ++i) b[i] = m[len2 - 1 - i] - '0';
    int maxn = max(len1, len2);
    for (int i = 0; i < len1; ++i) {
        for (int j = 0; j < len2; ++j) {
            c[i + j] += a[i] * b[j];//15 13     51*31     
        }
    }
    maxn=len1+len2;
    for (int i = 0; i < maxn; ++i) {
        if (c[i] >= 10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
    //去掉前置0
    while (c[maxn-1] == 0 && maxn > 1)  maxn--;
    if (flag) cout << "-";//如果是负数就加一个负号
    //因为是逆序,所以需要倒着输出
    for (int i = maxn - 1; i >= 0; --i) cout << c[i];
    return 0;
}

高精度阶乘

#include<bits/stdc++.h>
#include<ctype.h>
using namespace std;
int main()
{
	int a[100000]={0};
	int n;
	cin>>n;
	a[0]=1;
	for (int i=2;i<=n;++i)
	{
		int c=0;
		for (int j=0;j<10000;++j)
		{
			int s=a[j]*i+c;
			a[j]=s%10;
			c=s/10;
		}
	}
	int cnt;
	for (cnt=9999;cnt>0;cnt--)
	{
		if (a[cnt])break;
	}
	for (int i=cnt;i>=0;--i)
	{
		cout<<a[i];
	}
}

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值