高精度运算(C++)

合集下载

c 高精度加法

c 高精度加法

c 高精度加法C语言中的高精度加法是一种处理大数运算的方法,它可以实现超出标准整数范围的加法运算。

在日常的编程中,我们经常会遇到需要处理大数运算的情况,例如计算两个很大的整数的和,传统的整数运算方法已经无法满足需求。

本文将详细介绍C语言中的高精度加法的实现方法。

在C语言中,整数的表示范围是有限的,一般为-2^31到2^31-1。

超出这个范围的整数运算会导致溢出错误,得到错误的结果。

为了解决这个问题,我们可以使用字符串来表示大数,并通过模拟手工计算的方式进行加法运算。

我们需要将输入的两个大数转化为字符串,并计算出两个字符串的长度。

然后,我们可以从最低位开始,逐位相加,并将结果保存在一个新的字符串中。

需要注意的是,相加时要考虑进位的情况。

如果当前位的和大于等于10,那么进位为1,否则进位为0。

计算完当前位的和和进位后,将和的个位数添加到结果字符串中,并将进位保存起来。

接下来,我们继续处理下一位,直到两个大数的所有位都相加完毕。

最后,我们需要将结果字符串进行翻转,得到最终的结果。

下面是一个使用C语言实现的高精度加法的示例代码:```#include <stdio.h>#include <string.h>void reverse(char *str) {int i, j;char temp;int len = strlen(str);for (i = 0, j = len - 1; i < j; i++, j--) {temp = str[i];str[i] = str[j];str[j] = temp;}}void bigAddition(char *num1, char *num2, char *result) { int len1 = strlen(num1);int len2 = strlen(num2);int maxLen = len1 > len2 ? len1 : len2;int carry = 0;int sum;int i;for (i = 0; i < maxLen; i++) {int digit1 = i < len1 ? num1[i] - '0' : 0;int digit2 = i < len2 ? num2[i] - '0' : 0; sum = digit1 + digit2 + carry;result[i] = sum % 10 + '0';carry = sum / 10;}if (carry > 0) {result[maxLen] = carry + '0';result[maxLen + 1] = '\0';} else {result[maxLen] = '\0';}reverse(result);}int main() {char num1[] = "123456789012345678901234567890"; char num2[] = "987654321098765432109876543210"; char result[1000];bigAddition(num1, num2, result);printf("The sum is: %s\n", result);return 0;}```在上面的示例代码中,我们定义了一个 `bigAddition` 函数来实现高精度加法。

高精度算法

高精度算法

国王的麦子
• 古印度国王要褒奖他的聪明能干的宰相达伊尔 (国际象棋发明者),问他要什么。达伊尔回答 “殿下只要在棋盘上第一个格子放一粒麦子,在 第二个格子放两粒,在第三个格子放四粒,以后 的格子都是前一格的两倍。如此放满64格,我就 心满意足了。”国王想,这不难办到。但一袋麦 子很快就用完了,一仓库也用完了,全印度的麦 子也远远不够。输入n=64,请编写程序计算到底 总共需要多少粒麦子。(4.c/4.in/4.out)
高精度乘法
• 对于高精度乘法,相对考虑的问题比较多, 不光要考虑2次进位,还要考虑错位相加
• 先看个例子:
x
856 25
高精度乘法
x +
A2 A1 A0 B1 B0
C03C02C01C00 C13C12C11C10
4280 + 1712
21400
C4 C3 C2 C1 C0
•观察下右边式子,先看下中间每一项相乘中的Cij, 想一想,由哪些项得来的?
高精度
• 那么如何用1个数组来存1个“大数”呢? • 最简单的办法就是数组的每个元素存储这个大数 的每一位,比如数组的第一位存储大数的个位, 第二位存储大数的十位,以此类推 • 那么对于题目给定的大数输入,如何将它挨个存 储到自己定义的数组里去呢? • 读1个大数,最好先用字符串读进去,然后再将 字符型的“数”转换成数值的“数”
高精度算法
高精度
• 在C语言中,一个变量是int表示的范围是(32768~32767),是long表示的范围也只是-21亿 到21亿,那如果某个整数的范围超过这个范围就 没法运算。所以像一些比较大的数据就可以用特 殊的办法进行处理,这就是高精度的算法 • 高精度的思路是用1个变量表示不了1个数,那就 用多个变量来表示,当然,为了整合这个大数的 整体性,就用一串数组来存储1个数

C++知识点高精度

C++知识点高精度

C++知识点⾼精度⼀.⾼精度加法1.1 ⾼精度加法⾼精度运算的基本运算就是加和减。

和算数的加减规则⼀样,模拟竖式计算,考虑错位运算与进位处理。

#include <cstdio>#include <cstring>int main(){char a[202]={0}, b[202]={0};scanf("%s%s", a, b);int alen = strlen(a), blen = strlen(b), t = 0, i;int a1[202]={0}, b1[202]={0};for (i = 0; i < alen; i++) a1[i] = a[alen-1-i]-'0';for (i = 0; i < blen; i++) b1[i] = b[blen-1-i]-'0';alen = (alen > blen) ? alen : blen;for (i = 0; i <= alen; i++)t = a1[i]+b1[i], a1[i] = t%10, a1[i+1] += t/10;while (!a1[i] && i) i--;for(; i >= 0; i--) printf("%d", a1[i]);return0;}1.2 ⾼精度加法(压位)(清北学堂成果)int型可以存9位数字,⽽上述代码在数组的每个元素中只存了0-9中的⼀位数,可以说浪费了很多空间,⽽且计算机计算4+5和3333+4444⽤的时间是相同的,所以我们有时候⽤压位来节省空间和时间。

其原理如下:从键盘读⼊⼤整数并存放在字符数组中从后向前每⼋位数字存放在⼀个int型数组的⼀个元素中对两个数组的对应元素进⾏加减运算,有进位要进位,最后输出#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int INF = 1E8;struct Data{int u[50], l;Data(){memset(u, 0, sizeof(u)), l = 0;}void change(string a){int len = a.size(), k = len / 8, i = 0;l = k + (len%8 > 0);for (len; len > 8; len -= 8)sscanf(a.substr(len-8, 8).c_str(), "%d", &u[i++]);if (len > 0) sscanf(a.substr(0, len).c_str(), "%d", &u[i]);}void print(){int k = l-1;printf("%d", u[k--]);while (k >= 0) printf("%8.8d", u[k--]);printf("\n");}}a, b;int main(){string aa, bb, ac;cin >> aa >> bb;int ka = 0, kb = 0, i;a.change(aa),b.change(bb);for (i = 0; i < 50; i++)a.u[i] +=b.u[i], a.u[i+1] += a.u[i] / INF, a.u[i] %= INF;for (i = 49; a.u[i]==0 && i>0; i--);a.l = i + 1;a.print();return0;}⼆.⾼精度减法2.1 ⾼精度减法原理和加法⼀样,需要不过考虑的不是进位,⽽是借位。

C++-高精度乘法

C++-高精度乘法

高精度乘法
2、高精度×高精度
i=1..3 j=1..2
a[i]
b[j] ×
a[3] a[2]/b[2] a[1]/b[1]
345 23
a[i]×b[1]
———————————— c[5] c[4] c[3] c[2] c[1]
a[i]×b[2]
0 0 9 12 15 6 9+8 12+10
————————————————
竖式计算:138+12
138
+12
——————————
1 4 10 • 每位对
150
齐,按 位加,
每位若
超出
10旳
需要进
高精度加法
运算过程:
int c[1000]={0}; For(i=1;i<=max(s1.length(),s2.length());i++)
{ c[i]=(a[i]+b[i]) % 10 +c[i]; c[i+1]=(a[i]+b[i])/10; // 进位
• Input

输入两个整数x,y(0 <= x,y <= 10^100)
• Output

输出它们旳和
• Sample Input

123 234
• Sample Output

357
高精度加法
高精度运算主要处理下列三个问题: 1、加数、减数、运算成果旳输入和存储 2、运算过程 3、成果输出
高精度加法
高精度加法
运算过程: (1)运算顺序:两个数靠右对齐;
从低位向高位运算;先计算低 位再计算高位; (2)运算规则:同一位旳两个数 相加再加上从低位来旳进位, 成为该位旳和;这个和去掉向 高位旳进位就成为该位旳值; 如上例:8+2=10,向前一位进 1,本位旳值是0;可借助MOD、 DIV运算完毕这一步; (3)最终一位旳进位:假如完毕 两个数旳相加后,进位位值不 为0,则应添加一位; (4)假如两个加数位数不同多, 则按位数多旳一种进行计算;

c语言高精度运算模板

c语言高精度运算模板

c语言高精度运算模板
好的,下面为你提供一个C语言高精度运算模板,包括高精度加法、减法和乘法:
高精度加法:直接对位相加,当某位超过10直接取模运算,然后下一位直接对加相应多出的数即可。

高精度减法:当输入的$ss1$小于$ss2$时,需要交换两者的顺序,并率先输出一个负号。

然后执行循环,在循环中如果$a(i)<b(i)$,则直接向下一位借位,然后本位加10,$a(i)$加10。

高精度乘法:使用双重循环,$c$下标对应关系为$i+j-1$($i=j=1$开始)。

在循环中,将$a(i)$和$b(j)$相乘后的结果累加到$c(i+j-1)$中。

你可以根据实际需求对模板进行修改和调整,以满足不同的计算需求。

如果你还有其他问题,请随时向我提问。

高精度减法c++语言

高精度减法c++语言

高精度减法c++语言高精度减法是一种用于处理大整数的算术运算方法,本文介绍如何在c++语言中实现高精度减法。

一、数组存储大整数由于c++语言中整数的范围有限,无法处理大于int类型表示范围的整数。

因此,我们需要使用数组来存储大整数。

我们可以将大整数按照每4位一组,将其存储在数组中。

例如,对于数字5678910,我们可以将其存储在数组a中,a[0]=8910,a[1]=567。

二、高精度减法实现高精度减法的实现过程是将两个大整数逐位相减,同时考虑借位对结果的影响。

具体实现思路如下:1.判断两个大整数的大小关系,确保被减数大于减数,否则将结果取相反数。

2.用被减数逐位减去减数,同时考虑借位对结果的影响。

具体实现方法是,如果被减数当前位小于减数当前位,则向高位借位,将被减数当前位加上10,再减去减数当前位。

否则,直接将被减数当前位减去减数当前位。

3.如果被减数的最高位不等于0,则结果是正数,否则结果是负数。

下面是高精度减法的c++代码实现://用数组存储大整数const int MAXN=1005;struct bigint{int len;int a[MAXN];void clear(){memset(a,0,sizeof(a));len=1;}void input(){//输入大整数char s[MAXN];scanf("%s",s);len=strlen(s);for(int i=0;i<len;i++){a[i]=s[len-i-1]-'0';}}void output(){//输出大整数for(int i=len-1;i>=0;i--){printf("%d",a[i]);}printf("\n");}bool operator <(const bigint &B)const{//判断大小关系 if(len!=B.len) return len<B.len;for(int i=len-1;i>=0;i--){if(a[i]!=B.a[i]) return a[i]<B.a[i];}return false;}bigint operator -(const bigint &B)const{//实现减法 bigint C;C.clear();C.len=max(len,B.len);for(int i=0;i<C.len;i++){C.a[i]+=a[i]-B.a[i];if(C.a[i]<0){C.a[i]+=10;C.a[i+1]--;}}while(C.len>1&&C.a[C.len-1]==0) C.len--;return C;}};三、测试下面是一个简单的测试程序,用于测试上述高精度减法的正确性:int main(){bigint A,B,C;A.input();//输入被减数B.input();//输入减数if(A<B){//确保被减数大于减数C=A;A=B;B=C;printf("-");}C=A-B;//计算结果C.output();//输出结果return 0;}输入:123456789012345678901234567890 987654321098765432109876543210输出:-864197532086419753207901234320。

高精度加法 c语言

高精度加法 - C语言1. 任务背景在计算机科学中,整数可以使用有限位数的二进制表示。

但是在实际应用中,有时候需要处理非常大的整数,超过了计算机所能表示的范围。

这就导致了高精度整数的问题。

高精度整数指的是可以表示和计算任意位数的整数。

在处理大整数的加法运算时,需要设计算法来实现高精度加法。

C语言是一种被广泛使用的编程语言,具有高效、灵活和广泛的应用领域。

本文将介绍如何使用C语言实现高精度加法的算法和相关的注意事项。

2. 高精度加法算法实现对于两个大整数的加法,常用的算法是逐位相加,并考虑进位。

以下是一种高精度加法算法的实现步骤:1.从个位开始,逐位相加两个大整数的对应位,并考虑上一位的进位。

2.如果相加的结果大于等于10,则需要向下一位产生进位。

3.将相加的结果保存到结果数组中的对应位置。

4.对两个大整数的所有位数都进行相加操作,直到最高位。

5.最后,将结果数组转换为字符串表示,即为高精度整数的和。

以下是一个示例的C语言代码实现:#include <stdio.h>#define MAX_SIZE 1000void reverse(char *str) {int i = 0;int j = strlen(str) - 1;while (j > i) {char temp = str[j];str[j] = str[i];str[i] = temp;i++;j--;}}char* add(char *num1, char *num2) {int len1 = strlen(num1);int len2 = strlen(num2);int len = (len1 > len2) ? len1 : len2;int carry = 0;int sum[MAX_SIZE] = {0};reverse(num1);reverse(num2);for (int i = 0; i < len; i++) {int digit1 = (i < len1) ? (num1[i] - '0') : 0;int digit2 = (i < len2) ? (num2[i] - '0') : 0;int tempSum = digit1 + digit2 + carry;carry = tempSum / 10;sum[i] = tempSum % 10;}if (carry > 0) {sum[len] = carry;}int resultLen = carry > 0 ? len + 1 : len;char *result = (char *) malloc((resultLen + 1) * sizeof(char));for (int i = 0; i < resultLen; i++) {result[i] = sum[i] + '0';}result[resultLen] = '\0';reverse(result);return result;}int main() {char num1[MAX_SIZE];char num2[MAX_SIZE];printf("Enter first number: ");scanf("%s", num1);printf("Enter second number: ");scanf("%s", num2);char *result = add(num1, num2);printf("Sum: %s\n", result);free(result);return 0;}此示例程序通过逐位相加来计算两个大整数的和,并将结果以字符串的形式输出。

c++高精幂运算

c++高精幂运算
在C++中,进行高精度幂运算可以使用数组来存储中间结果,通过模拟手工计算的方式来完成计算。

以下是一种可能的实现思路:
1. 准备一个长度为3100的整数数组`a`,用于存储中间结果。

将数组的元素初始化为1。

2. 用变量`t`来存储当前数值是否需要进行进位,初始化为0。

3. 从数组的`a(0)`位置模拟个位,`a(1)`位置模拟十位……开始计算。

将数组的当前元素乘以2,并将结果与`t`相加,如果结果能被10整除,则将`t`置为1,否则为0。

4. 重复步骤3,直到计算完所有数组元素。

5. 用变量`m`来记录最后一次进位的位置。

6. 输出数组中的值,从`m - 1`的位置开始输出0,直到输出到数组的开头位置。

通过这种方法,可以在C++中实现高精度的幂运算。

需要注意的是,具体的实现细节可能会根据需求和精度要求有所不同。

高精度计算(C++版) ppt课件


{
char a1[100],b1[100];
int a[100],b[100],c[100],lena,lenb,lenc,i,x;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
gets(a1); gets(b1);
高精度计算中需要处理好以下几个问题:
(1)数据的接收方法和存贮方法
数据的接收和存贮:当输入的数很长时,可采用字符串方式输入, 这样可输入数字很长的数,利用字符串函数和操作运算,将每一位数取 出,存入数组中。另一种方法是直接用循环加数组方法输入数据。
void init(int a[])
//传入一个数组
x = c[i+j-1]/10;
c[i+j-1] %= 10; (4) 商和余数的求法
商和余数处理:视被除数和除数的位数情况进行处理.
PPT课件
3
【例1】高精度加法。输入两个正整数,求它们的和。
【分析】 输入两个数到两个变量中,然后用赋值语句求它们的和,输出。但
是,我们知道,在C++语言中任何数据类型都有一定的表示范围。而当 两个被加数很大时,上述算法显然不能求出精确解,因此我们需要寻求 另外一种方法。在读小学时,我们做加法都采用竖式方法,如图1。 这 样,我们方便写出两个整数相加的算法。
{
//处理被减数和减数,交换被减数和减数
strcpy(n,n1);
x=0;
PPT课件
6
while (lenc <=lena||lenc <=lenb)
{
c[lenc]=a[lenc]+b[lenc]+x; //两数相加

C语言的高精度算法

C语言的高精度算法高精度算法是指用来处理大数运算的算法,它可以在计算机内存限制范围内实现对任意长度整数的高精度计算。

C语言是一种通用的、高效的编程语言,非常适合用来实现高精度算法。

一、基本思想高精度算法的基本思想是将大整数拆分成多个小整数进行运算,再通过运算规则将结果合并。

实现高精度算法的关键是对大数进行拆分、运算和合并。

二、大整数的表示在C语言中,大整数可以通过结构体、数组或字符串等方式进行表示。

其中,使用数组方式最为常见。

例如,可以使用一个字符数组来存储大整数的每一位数字,数组的每个元素都是一个字符,表示一个数字。

三、实现加法算法高精度加法算法的基本步骤如下:1.将两个大整数转换为数组,存储每一位的数字。

2.从最低位开始,按位进行相加。

同时考虑进位,如果有进位则在下一位相加时加13.将每一位的和保存到结果数组中。

4.最后,将结果数组合并成一个大整数。

四、实现减法算法高精度减法算法与加法算法类似,只是在相减时需要考虑借位的问题。

基本步骤如下:1.将两个大整数转换成数组,存储每一位的数字。

确保被减数大于减数。

2.从最低位开始,按位进行相减。

如果当前位不够减,则向高位借位。

3.将每一位的差保存到结果数组中。

4.最后,将结果数组合并成一个大整数。

五、实现乘法算法高精度乘法算法的基本思路是利用竖式乘法的方法,从最低位开始,按位相乘。

基本步骤如下:1.将被乘数和乘数转换为数组,存储每一位的数字。

2.从最低位开始,按位进行相乘,并将结果保存到一个临时数组中。

3.将各位的乘积进行合并,得到结果数组。

4.最后,将结果数组合并成一个大整数。

六、实现除法算法高精度除法算法的基本思路是利用竖式除法的方法,从最高位开始按位相除。

基本步骤如下:1.将被除数和除数转换为数组,存储每一位的数字。

2.初始化商数组为0。

3.从最高位开始,按位进行相除,并将商保存到商数组中。

4.对余数进行处理。

如果余数不为零,则在下一位相除时将余数带进去。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

万进制高精度运算(C++语言)目前在青少年信息学奥林匹克竞赛中所涉及到的高精度计算包括加(addition)、减(subtract)、乘(multiply)、除(divide)四种基本运算。

其中乘法分高精度数乘高精度数和单精度数乘高精度数两种,除法一般指两个单精度数相除,求解最终指定精度的解,找出循环节或输出指定精度位数的小数。

(注:高精度数与单精度数均指整数)主要的解题思想是利用在小学就曾学习过的竖式加减乘除法则,用程序语言实现存在的问题主要有如何存储高精度数的值,如何实现计算等问题。

一. 高精度数字的存储我们日常书写一个高精度数字,左侧为其高位,右侧为其低位,在计算中往往会因进位(carry )或借位(borrow )导致高位增长或减少,因此我们定义一个整型数组(int bignum[maxlen])从低位向高位实现高精度整数的存储,数组的每个元素存储高精度数中的一位。

(如下表所示)高精度数 3(高位)…… 7 9 4(低位)int bignum[i]n……21显然,在C++语言中,int 类型(4个字节/32位计算机)元素存储十进制的一位数字非常浪费空间,并且运算量也非常大,因此常将程序代码优化为万进制,即数组的每个元素存储高精数字的四位。

在后面的叙述过程中均以万进制为例介绍。

(为什么选择万进制,而不选择更大的进制呢?十万进制中的最大值99999相乘时得到的值是9999800001超过4个字节的存储范围而溢出,从而导致程序计算错误。

)在实际编写程序代码过程中常作如下定义: const int base=10000; const int maxlen=1000+1; int bignum[maxlen];说明:base 表示进制为万进制,maxlen 表示高精度数的长度,1个元素能存储4个十进制位,1000个元素就存储4000个十进制位,而加1表示下标为0的元素另有它用,常用作存储当前高精度数字的位数。

二. 各种运算的程序实现 (一)加法:首先回顾一下小学中曾学习的竖式加法,见图一:bignum1[] 9475 46 1243 bignum2[]918 1324 341 carry1 0 0 0 bignum_ans[]139313701584图一 加法的计算过程从上面的图中我们可以得知,做加法运算是从低位向高位进行,如果有进位,下一位进行相加时要加上进位,如果最高位已计算完还有进位,就要增加存储结果的位数,保存起进位来。

关于进位的处理,往往定义单独变量carry 进行存储,程序实现的过程如图二所示:初始化进位carry 赋初始值0,结果的位数为两个加数的最大位数。

当前位超过最高位了?处理当前位和进位NY还有进位么?N处理进位Y图二 加法的实现过程高精度加法程序代码(bignum1+bignum2→bignum_ans ):void addition(int *bignum1, int *bignum2, int *bignum_ans){ int carry=0; memset( bignum_ans, 0, sizeof(bignum_ans) );// memset 作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

*bignum_ans=*bignum1>*bignu2?*bignum1:*bignum2; for(int pos=1; pos<=*bignum_ans; pos++){ carry+=bignum1[pos]+bignum2[pos]; bignum_ans[pos]=carry%base; carry/=base; } while(carry){ bignum_ans[++*bignum_ans]=carry%base; carry/=base; } }说明:函数中的数组是引用传递,传递的是数组的首元素的地址,可用指针来代替,当前指针所指向的为0元素,后面的代码相同。

有的同学可能提出,在加法运算中的进位不管进制是多少,进位只可能出现1,用while 循环没有意义,在这里说明一下,为了跟后面乘法中出现的代码相匹配才采用这种处理方法,实现代码的统一性。

(二)减法:bignum1[] 132 9475 46 1243 bignum2[] 132 918 1324 341 borrow 0 1 0 0 bignum_ans[]85568722902图三 减法的计算过程图三表示出了减法的计算过程,与加法不同的地方是进位变成了借位,另外就是计算结果的位数可能会比被减数的位数少,因此在处理过程中要更要注意结果到底是多少位的。

其次,日常我们做减法时,如果被减数小于减数,我们是把两数反过来进行相减,在前面添加负号标识。

因此,我们在编写减法子函数时是约定bignum1大于bignum2的,调用时首先判断两个高精度数的大小,然后根据两数的大小决定如何调用。

减法的实现过程如图四所示:图四 减法的实现过程高精度数比较程序代码:int bignumcmp( int *bignum1, int *bignum2 ){ if (*bignum1-*bignum2) return *bignum1-*bignum2; for (int pos=*bignum1; pos>0; pos--)初始化借位borrow 赋初始值0,结果的位数为被减数的位数。

当前位超过最高位了?处理当前位和借位NY结果高位为0?N结束结果位数减1Yif ( bignum1[pos]-bignum2[pos] ) return bignum1[pos]-bignum2[pos]; return 0;}说明:bignum1>bignum2返回正整数,bignum1==bignum2返回0,bignum1<bignum2返回负整数。

解释:首先进行两数的位数的比较,如果位数相同再从高位向低位比较。

高精度减法程序代码(bignum1-bignum2→bignum_ans ):void subtract( int *bignum1, int *bignum2, int *bignum_ans ){ int borrow=0; memset( bignum_ans, 0, sizeof(bignum_ans) ); *bignum_ans=*bignum1; for(int pos=1; pos<=*bignum_ans; pos++){ bignum_ans[pos]=bignum1[pos]-borrow-bignum2[pos]; if(bignum_ans[pos]<0){ bignum_ans[pos]+=base; borrow=1; }else{borrow=0; } } while( !bignum_ans[*bignum_ans] ) --*bignum_ans; }(三)乘法:乘法的计算过程正如图五所示的从乘数的最低位起枚举每一位与被乘数相乘,累加到结果当中。

高精度乘高精度实际是多次调用单精度数乘高精高数运算。

1 2 3 4 X 4 3 2 1 (1) 1 2 3 4 (2) 2 4 6 8 (3) 3 7 0 2 (4) 4 9 3 65332114图五 乘法的计算过程首先看一下单精度数乘高精度数的实现过程,如图六所示:初始化进位carry 赋初始值0,结果的位数被乘数的位数。

当前位超过最高位了?处理当前位和进位NY还有进位么?N结束处理进位Y图六单精度乘高精度实现过程单精度乘高精度程序代码(n*bignum→bignum_ans):void SingleMultiply(int n, int *bignum, int *bignum_ans){int carry=0;memset(bignum_ans, 0, sizeof(bignum_ans);*bignum_ans=*bignum;for(int pos=1; pos<=*bignum_ans; pos++){carry+=n*bignum[pos];bignum_ans[pos]=carry%base;carry/=base;}while(carry){bignum_ans[++*bignum_ans]=carry%base;carry/=base;}}高精度数乘高精度数,实质就是在单精度数乘高精度数的基础上枚举各个乘数位与被乘数相乘,累计到结果当中。

其中乘数中的第J位与被乘数中的第I位相乘时,结果应该保存到结果的第I+J-1位中,因为如果存在进位的问题结果的位数可能为乘数与被乘数的位数和,也可能为两者位数和减一,这一点也应该单独处理。

过程就不再展示了,具体的请阅读下面的程序代码:高精度乘高精度程序代码(bignum1*bignum2→bignum_ans):void BignumMultiply( int *bignum1, int *bignum2, int *bignum_ans){int carry=0, i, j;memset(bignum_ans, 0, sizeof(bignum_ans) );for (j=1; j<=*bignum2; j++){for(i=1; i<=*bignum1; i++){bignum_ans[i+j-1]+=carry+bignum1[i]*bignum2[j];carry=bignum_ans[i+j-1]/base;bignum_ans[i+j-1]%=base;}i=j+*bignum1;while(carry){bignum_ans[i++]=carry%base;carry/=base;}}*bignum_ans=*bignum1+*bignum2;while( !bignum_ans[*bignum_ans] ) --*bignum_ans;}(四)除法:除法在高精度计算中是最为特殊的,在近几年联赛中并没有出现类似的题目,除法类的高精度题目会涉及到精度和循环节问题,在这里首先用表格分析两个例子:例一:3除以8,结果为0.375被除数 3 30 60 40商0 . 3 7 5余数 3 6 4 0例二:45除以56,结果为0.803(571428)被除数 45 450 20 200 320 400 80 240 160 480 商 0 . 8 0357 1428余数45220 32 40 824 16 48 32在例一中展示的为能被除尽的情形,能被除尽的条件是余数为0,而在例二中56并不能除尽45,出现571428这个循环节,出现循环节的条件是当前的余数曾经出现在前面求得的余数序列中。

相关文档
最新文档