| 
| 
OICQ:215768265
  njucs2001@hotmail.com
  erichoo1982@gmail.com
| | « | October 2025 | » |  | 日 | 一 | 二 | 三 | 四 | 五 | 六 |  |  |  |  | 1 | 2 | 3 | 4 |  5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |  | |  | 
 |  
| 公告 |  
|  
本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!              ——既瑜 |  
| 统计 |  
| blog名称:★既瑜★ 日志总数:183
 评论数量:636
 留言数量:-25
 访问次数:1417389
 建立时间:2005年3月12日
 |  |  
 
 | W3CHINA Blog首页    管理页面    写新日志    退出 
|  [【技术文档】][转]分治法优化大整数乘法 C++实现 |  
| 上大学算法分析实验课的内容.关于利用分治法大整数乘法.还没有解决大整数的存储方式,应该是要利用一维数组来解决.所以目前只是5位数的运算没有问题.程序不是很健全,但是算法的核心部分应该是已经都在这里了.
VC++6.0下测试通过.
#include <iostream.h>#include <math.h>
long mult(long x,long y,int n);int num(long x);
void main() //主函数{ long x,y; cout<<"input x and y:"<<endl; cin>>x>>y; cout<<mult(x,y,num(x))<<endl;}
long mult(long x,long y,int n){ long a,b,c,d,s; if (n=1)  return x*y; else {  a=long(x/pow(10,(n/2))); //取x的左半部分  b=long(x%long(pow(10,(n/2)))); //取x的右半部分  c=long(y/pow(10,(n/2))); //取y的左半部分  d=long(y%long(pow(10,(n/2)))); //取y的右半部分  s=mult(a,c,n)*pow(2,n)+(mult((a-b),(d-c),n)+mult(a,c,n)+mult(b,d,n))*pow(2,n/2)+mult(b,d,n); //书上的公式  return (s); }}
int num(long x) //判断输入的数字的位数{ int i=0; if(x-9<=0)  return 1; else {  while (x!=0)  {   i++;   x=x/10;  }  return i; }}
 
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=505113
 
 |  
| 
 阅读全文(27123) | 回复(8) | 编辑 | 精华
 |  
 
| 回复:[转]分治法优化大整数乘法 C++实现 |  
| 
| liu(游客)发表评论于2012/9/26 11:29:55 |  以下引用孟宪龙(游客)在2012-5-8 10:29:18的评论:
 s=mult(a,c,n)*pow(2,n)+(mult((a-b),(d-c),n)+mult(a,c,n)+mult(b,d,n))*pow(2,n/2)+mult(b,d,n);
没有对n进行任何操作,递归永远跳不出来!是   求s的正确写法   急···
 
 |  
| 
 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 |  
 
| 回复:[转]分治法优化大整数乘法 C++实现 |  
| 
| 孟宪龙(游客)发表评论于2012/5/8 10:29:18 |  s=mult(a,c,n)*pow(2,n)+(mult((a-b),(d-c),n)+mult(a,c,n)+mult(b,d,n))*pow(2,n/2)+mult(b,d,n);
没有对n进行任何操作,递归永远跳不出来!
 
 |  
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |  
 
| 回复:[转]分治法优化大整数乘法 C++实现 |  
| 
| xiaogang(游客)发表评论于2007/10/22 21:11:04 |  #include <iostream.h>#include <math.h>
long mult(long x,long y,int n);int num(long x);
void main() //主函数{ long x,y; cout<<"input x and y:"<<endl; cin>>x>>y; cout<<mult(x,y,num(x))<<endl;}
long  mult(long int x, long int y, int n)  //{X和Y为2个小于2n的整数,返回结果为X和Y的乘积XY}{ long int s; if( ( (x>=0) && (y>=0) ) || ( (x<0) && (y<0) ) )        s = 1; else  s = -1;
    x=abs(x);      y=abs(y);            //{X和Y分别取绝对值}  
 if(n==1)  {  if((x==1)&&(y==1))    return s;                       else       return x*y*s;    }        else  {                         long int A=(long)(x/pow(10,(n/2)));           //X的左边n/2位;                         long int B=(long)(x%(long)(pow(10,(n/2))));     //X的右边n/2位;                           long int C=(long)(y/pow(10,(n/2)));           //Y的左边n/2位;                         long int D=(long)(y%(long)(pow(10,(n/2))));     //Y的右边n/2位;                            long int m1=mult(A,C,n/2);                         long int m2=mult(A-B,D-C,n/2);                         long int m3=mult(B,D,n/2);               
          s=s*(m1*pow(10,(n/2)*2)+(m1+m2+m3)*pow(10,n/2)+m3);                                      }  return s; }
int num(long x) //判断输入的数字的位数{    int i=0;    if(x-9<=0)       return 1;    else {       while (x!=0)    {          i++;          x=x/10;    }        return i; }}
 
 |  
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |  
 
| 回复:[转]分治法优化大整数乘法 C++实现 |  
| 
| apo(游客)发表评论于2007/9/28 21:30:14 |  if (n=1)  return x*y;永远为真,这个程序和直接求乘法一样的了,后面的全是废话
 
 |  
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |  
 
| 回复:[转]分治法优化大整数乘法 C++实现 |  
| 
| jun(游客)发表评论于2007/6/2 12:27:19 |  但是这个只能求一般的数啊,连10000000*100000之类的东西都求不了
 
 |  
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |  
 
| 回复:[转]分治法优化大整数乘法 C++实现 |  
| 
| zxl(游客)发表评论于2006/11/11 20:50:05 |  // *********************Algorithm: (a+ib)*(c+id)=(ac-bd)+i(bc+ad)**************************Complex Complex::operator*( const Complex &operand2 ) const{ return Complex( real * operand2.real - imaginary * operand2.imaginary,     imaginary * operand2.real + real * operand2.imaginary );}
 
 |  
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |  
 
| 回复:[转]分治法优化大整数乘法 C++实现 |  
| 
| flyfish(游客)发表评论于2006/3/23 15:17:39 |  如果要求两个复数乘法的话。。。怎么写?
 
我的QQ414147419
 
 |  
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |  
 
| 回复:[转]分治法优化大整数乘法 C++实现 |  
| 
| flyfish(游客)发表评论于2006/3/23 15:16:48 |  如果要求两个复数乘法的话。。。怎么写?
 
 |  
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |  
  »  1 » 
 |