大数据的乘法的原理和实现
2015-11-15 22:04
225 查看
大数据乘法算法步骤如下:
实例代码:
1. 计算被乘数各个位上与乘数各个为的积,按位错开。如下面:先计算被乘数的个位(5*9 = 45,4*9 = 36……1*9 = 9),然后错开一位,计算被乘数的十位(1*5 = 5,……1*1=1)。 2. 把各位的加起来(将个位和十位计算的乘积按位相加,如45+0 = 45,36+5 = 41,……,1+0 = 1) 3. 十位进位,取个位,如 (45对10取模等于4,所以进向41进4,45对10取余等于5,所以留下5,其他以此类推) 4. 最后得出 12345*19 = 234555;
实例代码:
#include <stdio.h> #include <stdlib.h> void getbigdata (char *dataa , char *datab ) { int lengtha = strlen( dataa); //计算数组长度 int lengthb = strlen( datab); int * pres = ( int *) malloc( sizeof( int)*( lengtha + lengthb)); //用于储存中间变量 memset( pres, 0, sizeof( int)*( lengtha + lengthb)); //对指针所指的内存空间进行初始化,赋值为0 for ( int i = 0; i < lengtha; i++) { for ( int j = 0; j < lengthb; j++) { //将字符转化成整形进行乘法运算,完成乘数和被乘数的按位相乘,并且相加,并把结果储存在pres中 pres[ i+ j+1] += ( dataa[ i] - '0')*( datab[ j] - '0'); } } for ( int i = lengtha + lengthb - 1; i >= 0; i--) //进行进位,取余运算 { if ( pres[ i]>=10) { pres[ i - 1] += pres[ i] / 10; //进位 pres[ i] %= 10; //去除个位数 } } int i = 0; //刚刚对pres指向的内存全部初始化成了0,所以这里是将0去除 while ( pres[ i] == 0) { i++; } //将结果转存在lastres数组中 char * lastres = malloc( sizeof( char)*( lengtha + lengthb)); int j; for ( j = 0; j < lengtha + lengthb; j++, i++) { lastres[ j] = pres[ i] + '0'; } lastres[ j] = '\0'; //数组最后都带有一个\0结尾 printf( "last结果 = %s\n" , lastres ); } void main () { char str1[100] = { 0 }; char str2[100] = { 0 }; scanf( "%s%s" , str1 , str2 ); printf( "str1 = %s,str2 = %s" , str1 , str2 ); getbigdata( str1, str2); system( "pause" ); }
相关文章推荐
- Linux C函数参考手册(PDF版)
- Lua教程(十七):C API简介
- C#实现打造气泡屏幕保护效果
- C/C++数据对齐详细解析
- 利用C语言来求最大连续子序列乘积的方法
- 字符串的组合算法问题的C语言实现攻略
- C 语言基础教程(我的C之旅开始了)[三]
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- 最大子矩阵问题实例解析
- C字符串操作函数实现方法小结
- C语言中static的作用及C语言中使用静态函数有何好处
- 字典树的基本知识及使用C语言的相关实现
- 详解C语言中free()函数与getpagesize()函数的使用
- C/C++ 宏详细解析
- 使用C语言解决字符串全排列问题
- C/C++实现对STORM运行信息查看及控制的方法
- 用C#生成不重复的随机数的代码
- C#代码实现PDF文档操作类