密码学之大数加法
2017-03-28 22:12
330 查看
大数加法是密码学中比较基础的算法。人人都要掌握。
实现原理:
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语言,是为了展现算法的过程,让人了解原理。
所需头文件
核心代码
调用代码:
附上其他大数运算:
大数减法http://blog.csdn.net/qq_35524916/article/details/67745337
大数乘法点击打开链接
实现原理:
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
大数乘法点击打开链接
相关文章推荐
- HDU A + B Problem II(大数加法)
- 大数的加法
- 大数运算之加法
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
- vector、string实现大数加法乘法
- 大数的加法
- 大数加法 及 乘法
- 大数加法
- C++实现大数运算 加法部分。
- Integer Inquiry【大数的加法举例】
- 大数加法
- 大数乘法与大数加法 java实现
- HDOJ 1002:大数加法
- 大数加法的处理技巧
- 发个大数加法的类
- 大数加法
- 算法提高 ADV-136 大数加法
- HDOJ1002大数加法
- 斐波那契额数列+大数加法
- A + B Problem II(hdu1002,大数加法)