超长整数运算(大数运算)(算法)
2012-08-06 22:48
411 查看
说明基于记忆体的有效运用,程式语言中规定了各种不同的资料型态,也因此变数所可以表达的最大整数受到限制,例如123456789123456789这样的整数就不可能储存在long变数中(例如C/C++等),我们称这为long数,这边翻为超长整数(避免与资料型态的长整数翻译混淆),或俗称大数运算。
解法一个变数无法表示超长整数,则就使用多个变数,当然这使用阵列最为方便,假设程式语言的最大资料型态可以储存至65535的数好了,为了计算方便及符合使用十进位制的习惯,让每一个阵列元素可以储存四个位数,也就是0到9999的数,例如:
很多人问到如何计算像50!这样的问题,解法就是使用程式中的乘法函式,至于要算到多大,就看需求了。
由于使用阵列来储存数值,关于数值在运算时的加减乘除等各种运算、位数的进位或借位就必须自行定义,加、减、乘都是由低位数开始运算,而除法则是由高位数开始运算,这边直接提供加减乘除运算的函式供作参考,以下的N为阵列长度。
void add(int *a, int *b, int*c) {
int i, carry = 0;
for(i = N - 1; i >= 0; i--) {
c[i] = a[i] + b[i] + carry;
if(c[i] < 10000)
carry = 0;
else { //
进位
c[i] = c[i] - 10000;
carry = 1;
}
}
}
void sub(int*a, int *b, int *c) {
int i, borrow = 0;
for(i = N - 1; i >= 0; i--) {
c[i] = a[i] - b[i] - borrow;
if(c[i] >= 0)
borrow = 0;
else { //
借位
c[i] = c[i] + 10000;
borrow = 1;
}
}
}
void mul(int*a, int b, int *c) { // b
为乘数
int i, tmp, carry = 0;
for(i = N - 1; i >=0; i--) {
tmp = a[i] * b + carry;
c[i] = tmp % 10000;
carry = tmp / 10000;
}
}
void div(int *a,int b, int *c) { // b
为除数
int i, tmp, remain = 0;
for(i = 0; i < N; i++) {
tmp = a[i] + remain;
c[i] = tmp / b;
remain = (tmp % b) * 10000;
}
}
解法一个变数无法表示超长整数,则就使用多个变数,当然这使用阵列最为方便,假设程式语言的最大资料型态可以储存至65535的数好了,为了计算方便及符合使用十进位制的习惯,让每一个阵列元素可以储存四个位数,也就是0到9999的数,例如:
很多人问到如何计算像50!这样的问题,解法就是使用程式中的乘法函式,至于要算到多大,就看需求了。
由于使用阵列来储存数值,关于数值在运算时的加减乘除等各种运算、位数的进位或借位就必须自行定义,加、减、乘都是由低位数开始运算,而除法则是由高位数开始运算,这边直接提供加减乘除运算的函式供作参考,以下的N为阵列长度。
void add(int *a, int *b, int*c) {
int i, carry = 0;
for(i = N - 1; i >= 0; i--) {
c[i] = a[i] + b[i] + carry;
if(c[i] < 10000)
carry = 0;
else { //
进位
c[i] = c[i] - 10000;
carry = 1;
}
}
}
void sub(int*a, int *b, int *c) {
int i, borrow = 0;
for(i = N - 1; i >= 0; i--) {
c[i] = a[i] - b[i] - borrow;
if(c[i] >= 0)
borrow = 0;
else { //
借位
c[i] = c[i] + 10000;
borrow = 1;
}
}
}
void mul(int*a, int b, int *c) { // b
为乘数
int i, tmp, carry = 0;
for(i = N - 1; i >=0; i--) {
tmp = a[i] * b + carry;
c[i] = tmp % 10000;
carry = tmp / 10000;
}
}
void div(int *a,int b, int *c) { // b
为除数
int i, tmp, remain = 0;
for(i = 0; i < N; i++) {
tmp = a[i] + remain;
c[i] = tmp / b;
remain = (tmp % b) * 10000;
}
}
相关文章推荐
- 对超长整数运算(大数运算)的算法探究
- 7 超长整数运算(大数运算)
- 大数运算(超长整数运算)算法的简单分析
- 【大数算法】( 十进制整数四则运算) 十进制运算与二进制比较与思考
- 超长整数的基础运算 算法实现之加、减篇
- Algorithm Gossip (16) 超长整数运算(大数运算)
- 超长整数的基础运算 算法实现之模、模幂篇
- 超长整数的基础运算 算法实现自平方篇
- 超长整数运算(大数运算)
- 超长整数的基础运算 算法实现之进制转换篇
- 超长整数的基础运算 算法实现之准备篇
- 超长整数的基础运算 算法实现之乘、除篇
- 算法--两种方法实现一个Add函数,让两个整数相加,但是不能使用+、-、*、/等四则运算符。
- 两个大数相加比较符合自然运算的算法
- 大数算法 -- 正整数相乘(Java 实现)
- [算法设计与分析]3.2.4大整数存储及运算(高精度*长整数+n!)
- Qt使用第三方库GMP,用以超长整数运算
- 算法习题45:对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一;;;一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 超长整数的基础运算 之小结
- 超大整数运算算法——为RSA加密算法提供运算工具