16进制高精度计算的加减乘20211001

本文档展示了一个C++程序,用于处理大整数的加法运算。程序使用`std::vector<unsigned long long int>`存储大整数,并通过自定义的`add`函数实现加法操作。程序考虑了进位和数值溢出的情况,适用于超过`UINT32_MAX`的大整数。此外,还提供了一个`printVhex`函数以16进制格式打印结果。
摘要由CSDN通过智能技术生成

// 20test21long-intConA1001.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//UINT32_MAX 进制的 +-* 和 分余

#include <iostream>
#include <vector>

using namespace std;

typedef unsigned long long int ulli;
//
unsigned short shorA = 0xffff;
unsigned short MaxShor = 0xffff;
unsigned int ina = 0xffffffff;//8个f
unsigned int Maxint = 0xffffff;//8个f
unsigned int MaxInt = UINT32_MAX;
//unsigned int ina = 0xffffffffffffffff;  //最多16个f
unsigned long long int llib = 0xffffffffffffffff; //16个f
unsigned long long int MaxULli = 0xffffffffffffffff;

std::vector<ulli> ulla1 = { 0 };//从右至左存储数位

int maxLen01(std::vector<ulli> a, std::vector<ulli> b)
{
    int u = a.size();
    int v = b.size();
    if (u > v) return u;
    else return v;
}//int maxLen01


void add(std::vector<ulli> a, std::vector<ulli> b, std::vector<ulli>& c)
{
    int tmpMax = maxLen01(a, b);
    unsigned int jinwei = 0;
    unsigned long long tmp_sum = 0;
    std::vector<unsigned int> jinWei;// = { 0 };
//    jinWei[0] = 0;
    jinWei.push_back(0);// 进位 的下标 比 结果 c的下标 多 +1  即 :  c[i]= a[i]+b[i]+ jinwei[i+1];
//    jinWei.push_back(0);//
//    c.push_back(0);

    for (int i = 0; i < tmpMax; ++i)
{
        //下面开始 用 “竖式”加法:
        tmp_sum = a[i] + b[i] + jinWei[i];// +c[i];// c[i];   // jinWei[i + 1];      //c0=a0+b0+ jinwei[1]

        //当 前一位没有进位的时候:
        //if (jinWei[i] <= 0) { c.push_back(0); } //有进位时候 就 不要 push了,因为 push过了! //本位 的 容器 要提前 生成;
        //上次没有 进位, 所以 要单独 push一个

        //jinWei.push_back(0);
        if (tmp_sum > (ulli)MaxInt ) {//if220
            jinWei.push_back((tmp_sum >> 32) ); //生成 更 高一位(下一进位、更高一位进位) 的 进位(容器)
            //c[i] = (tmp_sum - MaxInt - 1);//本位的处理: 如(地位)上一次 有进位则:
                    if (jinWei[i] > 0) { c[i] = tmp_sum - MaxInt - 1; }
                    else if (jinWei[i] <= 0) { c.push_back( tmp_sum-MaxInt-1 ); } //推迟生成 本位(容器);有进位时候 就 不要 push了,因为 push过了! //本位 的 容器 要提前 生成
                c.push_back(tmp_sum >> 32); //高位//生成 高 一位的容器 //注意此处 早 生成了 一次 (上位)下一次的 c容器
//            tmp_sum = tmp_sum - MaxInt-1;//这句纯粹 防止 c的长度 大于 (Max(a,b)者);
        }//if220
        else if (tmp_sum <= MaxInt) { jinWei.push_back(0); //进位
                if (jinWei[i] > 0) { c[i] = tmp_sum - MaxInt - 1; }
                else if (jinWei[i] <= 0) { c.push_back(tmp_sum - MaxInt - 1); } //推迟生成本位(容器)//本位

                jinWei.push_back(0 ) ;// 也要生成 更高 一位(下一位)进位 容器
        }

        //c[i] = tmp_sum;
        
    }//for110i

}//void add

void printVhex(std::vector<ulli> c) //打印 16进制 十六进制格式
{
    int tmpLen = c.size();
    std::cout << hex;
    
    for (int i = tmpLen; i > 0; --i) {
        std::cout << hex;
        unsigned long long tmp_ull = c[i - 1];
        tmp_ull = tmp_ull << 32; //去掉  高位, 不管 高位 是 否 为0
        tmp_ull = tmp_ull >> 32;
        std::cout << tmp_ull;
    }
    std::cout << std::endl;
}//void printV

int main()
{
    //
    std::cout << hex;
    std::cout << "UINT32_MAX:"<<UINT32_MAX << endl;
    std::cout << "UINT64_MAX:"<<UINT64_MAX << endl;
    std::cout << "UINTMAX_MAX:"<<UINTMAX_MAX << endl;
//    std::cout << LLONG_MAX << endl;
    std::vector<ulli> a1;
    std::vector<ulli> b1;
    std::vector<ulli> c1;

 //   ula1[0] = 0x11111111;
    a1.push_back(0xffffffff);// 111111111);
    a1.push_back(0x2);

    printVhex(a1);

//    ulb1[0] = 0x333333333;
    b1.push_back(0xeeeeeeee);// 33333333);
    b1.push_back(0x1);
    printVhex(b1);

    maxLen01( a1, b1);


    add( a1, b1, c1);

    printVhex(c1);

    //
//    LongLVecto aa12;


}//

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值