密码学之大数加法

大数加法是密码学中比较基础的算法。人人都要掌握。


实现原理:

1,采用字符数组存储输入的两个大数str1、str2。

2,设置一个能够容纳最大大数位数+1的字符数组result。

3,str1与result同时从后往前遍历,str1在result对应位置赋上str1的值(str1个位给result个位赋值,str1十位给result十位赋值。。。)

4,str2与result同时从后往前遍历,str2在result对应位置加上str2的值(result个位加上str2的个位,result十位加上str2的十位。。。)。

5,注意result[i]用来保存与大数对应位相加的结果,暂时不进位。

6,对于result的赋值完成后。从后往前遍历result数组。若某一元素大值大于9,则需要往前进位,否则继续。直到result[0].

7,判断result[0]是否为'0',及结果的首位是否为'0',若是,则需将result数组往前移动一位。


示意图:



注:本人使用C语言,是为了展现算法的过程,让人了解原理。

所需头文件

#include <stdio.h>
#include <string.h>
#include <assert.h>

核心代码

//大数加法
char *BigDataAdd(const char *str_1, const char *str_2, char *result)
{
	int len_1 = 0;
	int len_2 = 0;
	int maxlen = 0;
	int i = 0;
	
	assert(str_1 && str_2 && result);	//判断传入的str_1和str_2是否是空指针

	len_1 = strlen(str_1);	//获取str_1长度
	len_2 = strlen(str_2);	//获取str_2长度
	maxlen = len_1 > len_2 ? len_1 : len_2;//保存最大长度

	for (i = maxlen; len_1 > 0; --len_1)//从后往前,将每一位对应数字放入result中
		result[i--] += str_1[len_1-1] - '0';

	for (i = maxlen; len_2 >0; --len_2)//从后往前,将每一位对应数字放入result中
		result[i--] += str_2[len_2-1] - '0';

	for (i = maxlen; i >= 0; --i)//从后往前遍历result,判断当前result[i]的数值是否需要进位
	{
		if (result[i] > 9)
		{
			result[i-1] += result[i]/10;//需要进位,result[i]前一位result[i-1]加1.
			result[i] /= 10;
		}

		result[i] += '0';	//将数字转化为字符
	}

	if ('0' == result[0])
	{
		memmove(result, result+1, maxlen);//数组整体前移一位
		result[maxlen] = '\0';//最后一位变为有效字符串结尾。
	}

	return result;
}



调用代码:

void test()
{
	char str_1[1024] = {0};//存储number1
	char str_2[1024] = {0};//存储number2
	char result[1025] = {0};//存储result

	printf("输入number1:");
	scanf("%s", str_1);

	printf("输入number2:");
	scanf("%s", str_2);
	
	//大数加法
	BigDataAdd(str_1, str_2, result);
	//输出结果
	printf("result = %s + %s = %s\n\n", str_1, str_2, result);
}

int main()
{	
	
	do{
		test();
		
		getchar();
		printf("输入ctrl+z结束输入,输入Enter键继续。。。\n");
	}while (getchar() != EOF);

	return 0;
}


附上其他大数运算:

大数减法http://blog.csdn.net/qq_35524916/article/details/67745337

大数乘法点击打开链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值