`
mocca3in1
  • 浏览: 45304 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

大整数 乘法

阅读更多
代码转自: http://blog.csdn.net/OneGun/archive/2006/05/24/752177.aspx

就是高精度乘
模拟小学时学乘法竖式的方法

比如123*456

首先用一个数组a保存123
a[0]=1; a[1]=2; a[2]=3;
再用另外一个数组b保存456
b[0]=4; b[1]=5; b[2]=6;

做三次高精乘单精,如下:
a乘以b[0],得到c0数组为
c0[0]=a[0]*b[0]=4
c0[1]=a[1]*b[0]=8
c0[2]=a[2]*b[0]=12
a乘以b[1],得到c1数组为
c1[0]=a[0]*b[1]=5
c1[1]=a[1]*b[1]=10
c1[2]=a[2]*b[1]=15
同理,a乘以b[2],得到c2数组为
c2[0]=6
c2[1]=12
c2[2]=18

下一步,是c0 c1 c2三个数组,依次移位相加,得到数组d,如下:
c0[0] c0[1] c0[2]
______c1[0] c1[1] c1[2]
____________c2[0] c2[1] c2[2]
--------------------------------
_d[0]  d[1]  d[2]  d[3]  d[4]
_4     13    28    27    18

最后一步,是对d数组的整理啦
从个位开始,每一位,如果大于9,则求模,前一位进位
for (i=4; i>0; i--)
__if (d[i]>9)
__{
____d[i-1]+=d[i]/10;
____d[i]=d[i]%10;
__}
经过整理,数组d各元素如下:
d[0]  d[1]  d[2]  d[3]  d[4]
5     6     0     8     8

因此,依次输出,得到56088
123*456=56088

大数相乘亦此道理也~





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

#define Max 100      //这个数可以根据需要调整!

char res[Max];

void Init_char(char *res)
{
int i;
for(i=0; i<Max; i++)
{
  res[i] = '0';
}
return ;
}
void Init_int(int *a)
{
int i;
for(i=0; i< Max; i++)
  a[i] = 0 ;
}

/***********************************************************
* Function    : 大整数相乘
* description : 两个大整数相乘,因为数组的存放方式和我们的乘法
              是互逆的,所以需要从数组的最后一位往前面乘,并把每次
     乘得到的结果先存放在一个数组中,乘完之后直接从这个
     数组读取数据.
* input       :  res 既是一个乘数,也是用于存放相乘结果,为了可以让不同位数的
                    的大整数相乘,把res数组设很大,并在前面添加'0'.
                  mulNum 只是一个乘数而已
* output      :  在相乘之后,把乘积输出.
* backworth   :  No backWorth!
**********************************************************/
void Long_Multy(char *res,char *mulNum)
{
int temp[Max];                  // 用来存放中间结果,用整型数据结构,方便运算!!!
int i,j;
int len;

Init_int(temp);               // 将数组元素都初始化为 0
len = strlen(mulNum);
int t = 0 ;
for(i=len-1; i>=0; i--,t++)   // mulNum 对应的元素
{
  for(j=Max-1; j>=0; j--)   // res 对应的元素
  {
   temp[j-t] += (res[j]-'0') * (mulNum[i]-'0');    // 乘的过程存储!
  }
}

int carry = 0 ;               // 整型结果转化为字符型结果.
for(i=Max-1; i>=0; i--)
{
  res[i] = (temp[i]+carry)%10+'0';
  carry = (temp[i]+carry)/10;
}

//--------------------输出乘积!
printf("相乘的结果为:\n");
for(i=0;i<Max;i++)
  if(res[i] != '0')
   break;
for(i;i<Max;i++)
  putchar(res[i]);
printf("\n");

return ;
}
void input(char *a,char *b)    // 输入需要一些转换,所以单独写成一个函数!
{
int len,i;
scanf("%s %s",a,b);
Init_char(res);
len=strlen(a);
for(i=len-1;i>=0;i--)      //往res数组存放乘数a.
  res[Max+i-len] = a[i];
}


int main()
{
char a[50],b[50];

input(a,b);
Long_Multy(res,b);

getch();
return 0 ;
}
分享到:
评论

相关推荐

    大整数乘法 c++ 代码

    大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码

    大整数乘法算法选择和分析

    ### 大整数乘法算法选择和分析 #### 引言 大整数乘法在密码学、生物信息学、基因工程等领域具有重要的应用价值。然而,这些数值往往超出了传统编程语言能够直接处理的范围,因此需要特殊的数据结构和算法来支持其...

    大整数乘法的C语言实现

    本项目"大整数乘法的C语言实现"提供了一个简洁的解决方案,能够处理200位的大整数乘法,尽管代码量不大,却充分展示了C语言处理复杂计算的能力。 首先,我们来看大整数乘法的基本原理。传统的小数乘法可以扩展到...

    大整数乘法---快速傅立叶变换(FFT)

    快速傅立叶变换(FFT)是一种高效的计算离散傅立叶变换(DFT)的算法,对于处理大整数乘法具有重要的应用价值。在计算机科学尤其是数学和信号处理领域,FFT是解决复杂数学问题的关键工具。本文将深入探讨FFT在大整数...

    二进制的大整数乘法

    ### 二进制大整数乘法的知识点详解 #### 1. 分治法与大整数乘法 - **分治法基本思想**:分治法是一种将问题分解成若干个规模较小的子问题来解决的方法。这些子问题相互独立且与原问题相同,最后将子问题的解合并...

    大整数乘法分治算法实现

    大整数乘法是计算机科学中的一个重要问题,特别是在处理金融计算、加密算法或者数学运算时。传统的乘法算法,如竖式乘法,对于小整数是有效的,但当涉及非常大的数字时,效率就变得极低。为了解决这个问题,计算机...

    Python 实现大整数乘法算法的示例代码

    Python中的大整数乘法是处理超过普通整型范围的大数乘法的一种方法。在Python中,整数类型(int)可以自动处理任意大小的数值,包括大整数。但当我们需要高效地处理大整数乘法时,尤其是对位数较多的数进行运算,就...

    相当不错的大整数乘法算法

    本文将深入探讨一种用于大整数乘法的算法,该算法以数组为数据结构来存储和处理计算过程,具有较高的效率。 标题中的"相当不错的大整数乘法算法"指的是一种能有效处理超出常规整型范围的大整数乘法方法。在描述中...

    C语言实现大整数乘法

    下面我们将深入探讨C语言实现大整数乘法的相关知识点。 首先,C语言标准库并不直接支持大整数的操作,它提供的`int`、`long`等类型有其存储和运算限制。为了处理大整数,我们需要自定义数据结构。通常,我们会选择...

    大整数乘法实现(未用分治与递归

    大整数乘法实现(未用分治与递归) 大整数乘法是计算机科学中的一种基本运算,它在密码学、数据加密、科学计算等领域中有着广泛的应用。在本文中,我们将实现大整数乘法的算法,着重于探讨未使用分治与递归的实现...

    大整数乘法问题_LargeIntegerMulti_algorithm

    在计算机科学领域,处理大整数乘法是一个重要的计算任务,特别是在加密算法、数学软件以及分布式计算中。本文将深入探讨“大整数乘法问题”及其解决方案——分而治之算法,结合“LargeIntegerMulti_algorithm”这个...

    大整数乘法的实现

    ### 大整数乘法的实现 #### 实验背景及目的 随着计算机技术的发展,大整数乘法在密码学、大数据处理等领域有着广泛的应用。然而,在计算机内部,硬件能够直接处理的整数通常受限于一定的位数范围,超出这个范围的...

    分治法求大整数乘法(可运行)

    在本案例中,我们探讨的是如何运用分治法来处理大整数乘法问题。大整数乘法在密码学、计算几何、计算生物学等领域都有广泛应用,特别是在涉及到大量数据计算时,传统的算术运算可能无法胜任,因此需要高效的方法。 ...

    大整数乘法c语言源文件

    大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法...

    大整数乘法实验报告/vc

    实验报告的标题“大整数乘法实验报告/vc”表明了本次实验的主题是关于大整数乘法的实现,使用的编程环境为VC(Visual C++)。实验的描述提到使用了分治策略来解决大整数乘法问题,并且提供了完整的可运行代码。 大...

    分治法大整数乘法课件

    **分治法大整数乘法** 分治法是一种经典的算法设计策略,它将一个复杂的问题分解成若干个较小的子问题,然后分别解决这些子问题,最后将子问题的解合并得到原问题的解。这种方法特别适用于那些可以通过分解来简化...

    大整数乘法实现

    ### 大整数乘法实现解析 在计算机科学中,处理大整数的乘法是一项基本但复杂的任务,尤其当涉及到超出标准数据类型(如`int`或`long`)所能表示的数值范围时。本篇文章将深入探讨一种基于字符串处理的大整数乘法...

    大整数乘法(分治法与不用分支的比较)

    在计算机科学中,大整数乘法是一个关键的计算任务,特别是在加密算法、数学软件以及高性能计算领域。本文将深入探讨两种不同的方法来处理大整数乘法:分治法和不使用分支的方法。这两种方法都是为了高效地计算超出...

Global site tag (gtag.js) - Google Analytics