高精度运算专题2-减法运算(The subtraction operation)
这个专题呢,我就来讲讲高精度的减法,下面是三个计算减法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回数组a里面
函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了。
①记录数组a、数组b、数组c的长度,放到第一位
②比较数组a和数组b的大小(长度长的大),如果大,交换也
③从前往后扫描数组a和数组b,每一位相减,如果数组a中的那一位<数组b中的那一位,就要借位(十位加十),再相减,存入数组c
注释:最后返回的ans是数组a与b的大小,-1则小,0则等,1则大
代码如下:
int sub(char strA[],char strB[],int c[])
//两个高精度的正整数a、b,计算a-b,结果放在c。
//c>0返回1;c==0返回0,c<0返回-1
{
char t[MaxLength];
int a[MaxLength]={},b[MaxLength]={};
int ans=,i;
int lenA,lenB,lenC,temp;
memset(c,,sizeof(c));
lenA=strlen(strA);
lenB=strlen(strB);
if( lenA<lenB || ( lenA==lenB && strcmp(strA,strB)< ) )
{
strcpy(t,strA);
strcpy(strA,strB);
strcpy(strB,t);
ans=-;
}
else if(strcmp(strA,strB)==)
{
ans=;
c[]=;
return ans;
}
init(strA,a);//从低位到高位存储
init(strB,b);//从低位到高位存储
i=;
while(i<=a[]||i<=b[])
{
if(a[i]<b[i])//借位
{
a[i]+=;
a[i+]--;
}
c[i]=a[i]-b[i];//注意:现在的C数组是从低位到高位存储的。
i++;
}
lenC=i;
while((c[lenC]==)&&(lenC>)) lenC--;//最高位的0不输出
c[]=lenC;
return ans;
}
函数2思路:这个减法函数和函数1差不多的,只是省去了把字符串转换成数字的部分
代码如下:
int sub2(int a[],int b[],int c[])// 输入高精度正整数a和b,计算a-b,结果存储在c。 c>0返回1;c==0返回0,c<0返回-1
{
int ans,i,temp,len;
int lenC;
memset(c,,sizeof(c)); ans=cmp(a,b);
if(ans==)
{
c[]=;
c[]=;
return ans;
}
else if(ans == -)
{//这里是表示a<b时要交换a和b
len=( a[]>b[] ? a[] : b[] );
for(i=;i<=len;i++)
{
temp=a[i];a[i]=b[i];b[i]=temp;
}
}
//下面开始做减法操作
i=;
while(i<=a[]||i<=b[])
{
if(a[i]<b[i])
{
a[i]+=;
a[i+]--;
}
c[i]=a[i]-b[i];//注意:现在的C数组是从低位到高位存储的。
i++;
}
lenC=i;
while((c[lenC]==)&&(lenC>)) lenC--;//消除高位无意义的0
c[]=lenC;
return ans;
}
函数3思路:这个函数优化了函数2,不用再开一个数组,大大地节省了时间
①首先得把数组a和数组b的长度分别存入a[0]、b[0]
②做减法,不够十要借位,十位数要加10,减去不够减的数
③最重要的一步:高位可能会有很多0,记得要消去
代码如下:
int sub3(int a[],int b[])//a=a-b 。 计算结果 a>0返回1;a==0返回0,a<0返回-1
{
int ans,i,temp,len;
int lenA;
ans=cmp(a,b);
if(ans==)
{
a[]=;
a[]=;
return ans;
}
else if(ans==-)
{
len=( a[]>b[] ? a[] : b[] );//这里是表示a<b时要交换a和b
for(i=;i<=len;i++)//排序
{
temp=a[i];
a[i]=b[i];
b[i]=temp;
}
}
//下面开始做减法操作
i=;
while(i<=a[]||i<=b[])
{
if(a[i]<b[i])//借位
{
a[i]+=;
a[i+]--;
}
a[i]=a[i]-b[i];//注意:现在的a数组是从低位到高位存储的。
i++;
}
lenA=i;
while((a[lenA]==)&&(lenA>)) lenA--;//消除高位无意义的0
a[]=lenA;
return ans;
}
函数4思路:这个函数优化了函数3,a=a-b,a>0返回1,a==0返回0,a<0返回-1,不过这个地方默认a>=b,主要是用于除法的操作过程
代码如下:
int sub4(int a[],int b[])//a=a-b 。a>0返回1,a==0返回0,a<0返回-1,不过这个地方默认a>=b,主要是用于除法的操作过程
{
int ans,i,temp,len;
int lenA; ans=cmp(a,b);
if(ans==)
{
a[]=;
a[]=;
return ans;
}
else if(ans==)
{
//下面开始做减法操作
i=;
while(i<=a[])
{
if(a[i]<b[i])
{
a[i]+=;
a[i+]--;
}
a[i]=a[i]-b[i];//注意:现在的a数组是从低位到高位存储的。
i++;
}
lenA=i;
while((a[lenA]==)&&(lenA>)) lenA--;//消除高位无意义的0
a[]=lenA;
}
return ans;
}
高精度运算专题2-减法运算(The subtraction operation)的更多相关文章
- 高精度运算专题3-乘法运算(The multiplication operation)
这个专题呢,我就来讲讲高精度的乘法,下面是三个计算乘法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回 ...
- 高精度运算专题1-加法运算(The addition operation)
这个专题呢,我就来讲讲高精度的加法,下面是一个计算加法的函数(用数组a加上数组b结果存到数组c里面). 思路:先测一下数组a和数组b的长度,分别放到a[0].b[0]里面去,再从第二位开始相加,记得满 ...
- 高精度运算专题-输出函数与字符串转数字函数(Output function and the string to number function)
输出函数:这个函数别看它小,但浓缩的都是精华啊 作用:对于高精度的数组进行倒序输出 思路:首先从被传入的数组第一位开始,一直往前扫输出就可以了(i--) 注释:因为每个数组的第一位是用来存储这个数组的 ...
- [code]高精度运算
数组存储整数,模拟手算进行四则运算 阶乘精确值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #includ ...
- 系统的讲解 - PHP 浮点数高精度运算
目录 概述 浮点数运算的"锅" 任意精度数学函数 常用数值处理方案 扩展 小结 概述 记录下,工作中遇到的坑 ... 关于 PHP 浮点数运算,特别是金融行业.电子商务订单管理.数 ...
- #C++初学记录(高精度运算)(加法)
高精度运算 不管是int还是double亦或者long long ,这些定义变量都有数据范围的一定限制,在计算位数超过十几位的数,也就是超过他们自身的数据范围时,不能采用现有类型进行计算,只能自己通过 ...
- ICPC Asia Nanning 2017 F. The Chosen One (高精度运算)
题目链接:The Chosen One 比赛链接:ICPC Asia Nanning 2017 题意 \(t\) 组样例,每组给出一个整数 \(n(2\le n\le 10^{50})\),求不大于 ...
- 算法模板 - C++ 高精度运算
C++算法板子 高精度 高精度推荐用python来写,python有大整数,这里写的是关于C++的高精度运算模板 1.高精 * 低精 #include <iostream> #includ ...
- Digital Root - SGU 118(高精度运算)
题目大意:有K组测试数据,然后每组有N个正整数,A1,A2,A3.....An,求出 A1 + A1*A2 + A1*A2*A3 + .......A1*A2*...An 的数根. 分析:有个对9取余 ...
随机推荐
- layoutSubviews在什么情况下会被调用
layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews. 2.addSubview会触发layoutSubviews. 3.设置view的Frame ...
- bat脚本学习
工作需求,写个bat脚本来启动自己的守护进程:bat方面完全空白啊~稍微学习了下,记录下来,后面复习! 直接上代码: 示例一:for字符串切割,切割文本中的字符串: test.txt 文本内容如下: ...
- PDF在线阅读 FlexPaper 惰性加载 ;
关于PDF在线阅读问题,比较普遍的做法是转换成swf文件来浏览:由于项目需要,就用 flexpaper 来实现了下,功能比较简单:但是文件的惰性加载确实让笔者挠头了一把! 下面是笔者的方法: 采用流的 ...
- nyoj587 hdu1045 简单深搜
#include<iostream> #include<cstdio> #include<queue> #include<vector> #includ ...
- 洛谷-拼数-NOIP1998提高组复赛
题目描述 Description 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4 ...
- NOIP2015-普及组复赛-第一题-金币
题目描述 Description 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币:之后四天( ...
- wpf listview 行变色
<ListView x:Name="listView_Date" Grid.Row="3" BorderBrush="{x:Null}" ...
- java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))
Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0) 阅读目录 为什么要克隆? 如何实现克隆 浅克 ...
- Quartz+log4net实现控制台程序定时运行,并且记录日志
c# 控制台程序定时运行,并记录日志. 组件Quartz + log4net Quartz定时运行程序,log4net记录日志. 首先建立控制台程序"QuartzTest" 安装Q ...
- SharpZipLib.dll 压缩文件,可以应用于MVC, webform. C# windows application 等等地方
Nuget 安装:Install-Package ICSharpCode.SharpZipLib.dll private void WriteZipFile(string[] filesToZip, ...