C++学习,使用数组存储二进制整数,进行大数相乘运算

VS2022

大数相乘是公钥密码学重要的编程基础知识,本文使用小学生的方法,用数组实现大数相乘。

一、代码如下

#include<iostream>
#define MAXN 20
using namespace std;
void ntom(int a[],  int n, int b[], int m) {//将n维数组高位补0成m维数组
	for (int i = 0; i < m - n; i++)
		b[i] = 0;
	for (int i = m - n, j = 0; i < m; i++, j++)
		b[i] = a[j];
}
void Mto0(int a[], int s, int t) {//就数组s位到t位初始化为0
	for (int i = s; i < t; i++)
		a[i] = 0;
}
void add(int a[], int b[], int c[], int n) {//c=a+b
	int temp1 = 0, temp2 = 0, e, d;//temp是进位标识,e,d是避免对a,b数组值的修改。
	for (int i = n - 1; i >= 0; i--) {
		e = a[i]; d = b[i];
		if (e && d) {//异或执行
			temp2 = 1; c[i] = 0 + temp1;
		}
		else if (e || d) {
			if (temp1) {
				temp2 = 1; c[i] = 0;
			}
			else {
				temp2 = 0; c[i] = 1;
			}
		}
		else {
			temp2 = 0; c[i] = 0 + temp1;
		}
		temp1 = temp2; temp2 = 0;//进位标识前进一步。
	}
}
void mult(int x1[], int y1[], int z[], int n) {//防止溢出,n代表y的位数,小于MAXN/2。
	int x[MAXN], y[MAXN];
	ntom(x1, n, x, MAXN);//将x1的高位补0
	ntom(y1, n, y, MAXN);//将y1的高位补0
	int x2[MAXN]; Mto0(x2, 0, MAXN);
	for (int i = MAXN - 1, k = 0; i >= MAXN - n; i--, k++) {//从低位到高位依次移位。
		if (y[i] == 1) {
			for (int j = MAXN - n; j < MAXN; j++) {
				x2[j - k] = x[j];
			}
			Mto0(x2, i + 1, MAXN);
		}
		else {
			Mto0(x2, 0, MAXN);
		}
		add(z, x2, z, MAXN);//将移位后的x加到z中。
	}
}
void main() 
	int n = 8;
	int x1[] = { 1,0,1,0,1,1,0,0 };
	int y1[] = { 1,0,0,1,0,0,1,1 };
	disp(x1, n);//打印x
	disp(y1, n);//打印y
	int z[MAXN]; Mto0(z, 0, MAXN);//将z置0
	mult(x1, y1, z, n);
	disp(z, MAXN);
}

总结

实现乘法必须实现加法,文章后续会使用递归方法,敬请期待。
这个代码能运行,但显然还有很大的优化空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值