大数运算模板

大数运算模板#include#include#include#includeusingnamespacestd;#defineMAX_DIGIT500//大数运算:加法intAdd(int*a,int*b,int*&result){if(a==NULL||b==NULL||re

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAX_DIGIT 500

//大数运算:加法
int Add(int *a,int *b,int *&result)
{
    if(a==NULL || b==NULL || result==NULL)
    {
        printf("multiply:input error/n");
        return -1;
    }
    int i=0,j=0;
    //初始化result数组
    for(i=0;i<MAX_DIGIT*2;++i)
    {
        result[i]=0;
    }
    for(i=0;i<MAX_DIGIT;++i)
    {
        result[i] += (a[i]+b[i]);
    }
    AjustEncodeArray(result,MAX_DIGIT*2);
    return 0;
}

//大数运算:减法
int Sub(int *a,int *b,int *&result)
{
    if(a==NULL || b==NULL || result==NULL)
    {
        printf("multiply:input error/n");
        return -1;
    }
    int i=0,j=0;
    //初始化result数组
    for(i=0;i<MAX_DIGIT*2;++i)
    {
        result[i]=0;
    }
    for(i=0;i<MAX_DIGIT;++i)
    {
        result[i] += (a[i]-b[i]);             //result里可以为负数
    }
    AjustEncodeArray(result,MAX_DIGIT*2);
    return 0;
}

//大数乘法
int Multiply(int *a,int *b,int *&result)
{
    if(a==NULL || b==NULL || result==NULL)
    {
        printf("multiply:input error/n");
        return -1;
    }
    int i=0,j=0;
    //初始化result数组
    for(i=0;i<MAX_DIGIT*2;++i)
    {
        result[i]=0;
    }
    //a[0]为个位起算,结果的偏移位为i+j,如个位*十位,则运算结果的偏移为0+1即1
    //例子:a[0]为9,b[1]为7,则result[1]加63
    for(i=0;i<MAX_DIGIT;++i)
    {
        for(j=0;j<MAX_DIGIT;++j)
        {
            result[i+j] += a[i]*b[j];
        }
    }
    AjustEncodeArray(result,MAX_DIGIT*2);
    return 0;
}



//逐位调整大数,如result为11 9 22 -3 -2调整为:1 0 3 9 -3,然后再对符号提升到最高位: 9 9 6 0 2... ... -1
//表示大数的值为-20699
void AjustEncodeArray(int *&result,unsigned int iMaxNum)
{
    int i = 0;
    unsigned int iNumFlag = 0;
unsigned int iWeight = 0;     //有效最高位的权值
//遍历找出有效数据的最高位的下标(正负都有可能)
    for(i=iMaxNum-1;i>=0;--i)
    {
         if(result[i]!=0)
        {
            iNumFlag=i;
            break;
        }
    }
    //从低位开始往上调整,规则:大于10的正数要进位,负数要借位
    for(i=0;i<iNumFlag;++i)
    {
        //进位
        if(result[i]>0)
        {
            result[i+1] += result[i]/10;        //十位以上都要进位
            result[i] = result[i]%10;           //调整进位后的当前位
        }
        else if(result[i]<0)
        {
            result[i+1] -= 1;        //忽略高位是否可借位,强行借位
            result[i] = 10+result[i];
        }
    }
    //若有效最高位为负数,需要对负号进行提升,就是对高位与余下低位进行一次减法
    if(result[iNumFlag]<0)
    {
        iWeight = -result[iNumFlag];
        int iMinuend[2*MAX_DIGIT]={
  
  0};
        iMinuend[iNumFlag] = iWeight;          //被减数
        result[iNumFlag] = 0;               //构造减数
        for(i=0;i<iNumFlag+1;++i)
        {
            result[i] = (iMinuend[i]-result[i]);
        }
        //调整借位
        for(i=0;i<iNumFlag;++i)
        {
            if(result[i]<0)
            {
                result[i+1] -= 1;
                result[i] = 10+result[i];
            }
        }
        result[iMaxNum-1] = -1;
    }
}


void PrintBigNum(int *result)
{
    int index = MAX_DIGIT*2-1;
    bool bNegative = false;
    //从最高位找到第一个不为负的位,从此位开始为有效值
    while(result[index]<=0)
    {
        if(result[index]<0)
        {
            bNegative = true;
        }
        index--;
    }
    if(bNegative)
    {
        printf("-");
    }
    for(int i=index;i>=0;--i)
    {
        printf("%d",result[i]);
    }
    printf("\n");
}

void CArray2revDigitArray(char *cArray,int *DigitArray,unsigned int iNum)
{
    int i = 0;
    unsigned int iLen = strlen(cArray);
    //初始化DigitArray
    for(i=0; i<iNum; ++i)
    {
        DigitArray[i] = 0;
    }
    for(i=0; i<iLen; ++i)
    {
        DigitArray[iLen-1-i] = cArray[i]-'0';
    }
}

int main()
{
    int a[MAX_DIGIT], b[MAX_DIGIT], resultArray[2*MAX_DIGIT];
    char cArray1[MAX_DIGIT], cArray2[MAX_DIGIT];
    int ret = 0;
    int *result = (int *)resultArray;
    printf("Input multiplier:\n");
    scanf("%s",cArray1);
    printf("Input multiplicand:\n");
    scanf("%s",cArray2);
    CArray2revDigitArray(cArray1,a,MAX_DIGIT);
    CArray2revDigitArray(cArray2,b,MAX_DIGIT);
    ret=Multiply(a,b,result);
    if(ret!=0)
    {
        printf("Multiply error,ret:%d\n",ret);
        return -1;
    }
    PrintBigNum(result);

    ret=Add(a,b,result);
    if(ret!=0)
    {
        printf("Multiply error,ret:%d\n",ret);
        return -1;
    }
    PrintBigNum(result);

    ret=Sub(a,b,result);
    if(ret!=0)
    {
        printf("Multiply error,ret:%d\n",ret);
        return -1;
    }
    PrintBigNum(result);
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184972.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • windows查看占用端口并关闭端口

    windows查看占用端口并关闭端口1.查看占用端口的进程IDnetstat-aon|findstr"12345"2.查看进程id对应的进程名tasklist|findstr"14100"3.杀掉进程taskkill/f/t/im___8TestServer_Start_in_G

    2022年7月20日
    14
  • C语言冒泡排序升序_c语言快速排序和冒泡排序

    C语言冒泡排序升序_c语言快速排序和冒泡排序任务代码:执行情况:知识总结:冒泡排序法:也叫升序排序法,但是相比起二分法查找只能应用于有序数列,二如何将一个无序数列变的有序就可以使用冒泡排序法!!!对上面的过程进行总结:该思想体现在成续上的解法是:实例:冒泡排序不仅仅可以应用于数字同样可以应用于字符字母的快速排序:心得体会:

    2025年6月15日
    3
  • Vue和vue全家桶有什么区别_Vue和vue全家桶有什么区别

    Vue和vue全家桶有什么区别_Vue和vue全家桶有什么区别vue全家桶都有什么全家桶,顾名思义,对于开发一个完整的中大型单页面应用项目所必须的所必须的插件和框架。注:此文章主要讲解vue-cli脚手架开发方式,不介绍各插件的具体使用方式,具体使用方式详见其他详细介绍文章。一、vue-clivue-cli也叫脚手架,官方定义为Vue.js开发的标准工具!相比scirpt标签引入,脚手架具有如下特点:1)、功能丰富对Babel、TypeScr…

    2025年7月24日
    4
  • 10条PHP编程习惯助你找工作

    10条PHP编程习惯助你找工作

    2021年10月15日
    39
  • mac之安装aircrack-ng

    mac之安装aircrack-ng1 在使用命令 brewinstalla ng 安装 aircrack ng 时 出现了这样的问题 2 在终端中执行 brewlinkairc ng 命令后又出现了新的问题 3 在 https apple stackexchang com questions upgrading brew in el capitan 网站中看到了 brewdoctor 命令 在

    2025年10月16日
    3
  • 什么是大数据架构?需要学什么内容?[通俗易懂]

    什么是大数据架构?需要学什么内容?[通俗易懂]大数据架构设计用来处理对传统数据库系统而言太大或太复杂的数据的引入、处理和分析。组织进入大数据领域的门槛各不相同,具体取决于用户的权限及其工具的功能。对某些组织来说,大数据可能意味着数百个GB的数据,而对另一些组织来说,大数据则意味着数百个TB的数据。随着处理大数据集的工具的发展,大数据的涵义也在不断地变化。慢慢地,这个术语更多的是指通过高级分析从数据集获取的价值,而不是严格地指数据的大小…

    2022年5月16日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号