大数运算模板

大数运算模板#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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • html的标签点击触发js函数的四种方法[通俗易懂]

    html的标签点击触发js函数的四种方法[通俗易懂] 方法1&lt;a href="" onclick="funct()"&gt;我是a标签&lt;/a&gt;方法2&lt;a href="javascript:funct()"&gt;我是a标签&lt;/a&gt;方法3&lt;a id=’funct’ &gt;我是a标签&lt;/a&gt; 方法4然后使用jq的方法

  • python matplotlib 画图刻度、图例等字体、字体大小、刻度密度、线条样式设置

    python matplotlib 画图刻度、图例等字体、字体大小、刻度密度、线条样式设置设置输出的图片大小:figsize=11,9figure,ax=plt.subplots(figsize=figsize)画简单的折线图,同时标注线的形状、名称、粗细:A,=plt.plot(x1,y1,’-r’,label=’A’,linewidth=5.0,ms=10)其中线条样式以及颜色设置可参考:https://blog….

  • 旅游管理系统

    旅游管理系统旅游管理系统介绍要求:ER图代码介绍高级数据库布置的实验作业要求:题目:设计与实现一个旅游预订系统,该系统涉及的基本信息有航班,出租车,宾馆和客户等数据信息。实体和其特征属性举例如下:FLIGHTS(StringflightNum,intprice,intnumSeats,intnumAvail,StringFromCity,StringArivCity);H…

  • 如何使vmware虚拟机中的Redflag Linux操作系统能够上网?

    如何使vmware虚拟机中的Redflag Linux操作系统能够上网? 第一种情况:主机使用PPPOE拨号上网方法一:NAT方式1、先关闭虚拟机中的操作系统,回到虚拟机主界面双击主界面右上方的的“Ethernet”,弹出“NetworkAdapter”对话框,选择“NAT”2、启动虚拟机操作系统,设置IP为动态获取,即通过DHCP获得。此时虚拟机中的操作系统用的是主机的IP,主机能够上网,那么虚拟机也能。方法二:Host-only方式1

  • pycharm双击但是无法打开的情况_mac电脑上pycharm怎么安装

    pycharm双击但是无法打开的情况_mac电脑上pycharm怎么安装本来pycharm用的好好地,电脑重启之后,突然就打不开了,双击没反应,重新安装也解决不了,百度找不到结果,就去google了。https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000120784-Can-t-open-IntelliJ-on-MacOs有兴趣的小伙伴可以看这个。主要意思就是,用命令行…

  • touchesBegan等方法不执行

    touchesBegan等方法不执行今天写了一个自定义控件继承于UILabel,想要在上面添加点击事件,用touchesBegan等一系列方法实现,程序跑起来自信满满,突然发现程序不执行该方法,找了半天,了解到貌似touch事件只能被UIView捕获,然后把label的用户交互开启了(发现UIImageView和UILabel的交互默认是关闭的),就能让下面的view捕获到touch事件了

发表回复

您的电子邮箱地址不会被公开。

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