大整数乘法问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}//ss=s22+xz
int sn=Weishu(ss),sum[M];
j=0;
for(i=sn-1;i>=0;i--)
{
sum[j]=ss[i];
j++;
}
return (sum);
}
}
int *add(int *u,int *v)
{int vn=Weishu(v),vin=0;
int j=0,i;
infile>>n;
Mult=Mul(n,U,V);
n=0;
while(*Mult==1 || *Mult==0)
{
mult[n++]=*Mult;
*Mult++;
}
for(i=0;i<n;i++) outfile<<mult[i];
outfile<<endl;
infile.close();
outfile.close();
y[i]=v[i];
z[i]=v[i+mid];
}
i=0;
aa=Mul(mid,w,y);
while(*aa==1 || *aa==0)
{
a[i]=*aa;
*aa++;
i++;
}
i=0;
bb=Mul(n/2,w,z);
while(*bb==1 || *bb==0)
{
b[i]=*bb;
*bb++;
i++;
int Weishu(int u[])
{
int t=0;
while(u[t]==1 || u[t]==0){
t++;
}
return t;
}
int *Mul(int n,int *u,int *v)
{
int w[M],x[M],y[M],z[M];
int a[M],b[M],c[M],d[M];
int wy[M],xz[M],wz[M],xy[M];
{
s11[j]=*s1;
j++;
*s1++;
}//s11=wz+xy
int sn1=Weishu(s11);
for(i=sn1-1;i>=0;i--) s11[i+n/2]=s11[i];
for(i=0;i<n/2;i++) s11[i]=0;
int *s2,s22[M];
s2=add(s11,wy);j=0;
int *aa,*bb,*cc,*dd;
int mid;
int i,j;
int Ji[M],k=0;
if(n==1)
{
Ji[k]=u[0]*v[0];
k++;
return(Ji);
}
else
{
mid=(n+1)/2;
for(i=0;i<mid;i++)
{
w[i]=u[i];
x[i]=u[i+mid];
计算的数据规模不能太大。
(5)叙述通过实验你对XXX方法的理解及其优缺点。
通过本次实验使我进一步理解了分治递归的思想。认识到利用分治的关键是递归思路的清晰,用递归编写的程序很简单。用分治递归思想编写程序能把大问题变为小问题,而且不需要考虑一些细节问题,总之在碰到过程非常复杂的时候,又能用分治递归解决的问题时,用分治递归是一个很好的方法。。
int c[M],vu[M];
int un=Weishu(u);
for(i=0;i<un;i++){
vu[i]=v[i]+u[i]+vin;
if(v[i]==1 && u[i]==1);
else vin=0;
if(vu[i]>=2){
vin=vu[i]/2;
vu[i]=vu[i]%2;
}
}
for(i=un;i<vn;i++)
int U[M],V[M],mult[M];
infile.open("input.txt",ios::in);
outfile.open("output.txt",ios::out);
while((ch=infile.get())!=' ') U[n++]=ch-48;
n=0;
while((ch=infile.get())!='\n') V[n++]=ch-48;
}
(2)
调试中出现的问题:一开始并不是任意两个四位数相乘都可以得到正确结果,原因是我把待相乘的两个数定义为整型,递归函数的返回类型也定义为int,发现结果不对。后来通过将其定义为长整型,递归函数的返回类型也定义为long型才能够完成在计算机允许的数据范围内完成两个大整数的相乘。
三
回答以下问题:
(1)算法实现的复杂度在问题规模很大时可以接受吗?
{
vu[i]=v[i]+vin;
vin=来自百度文库;
if(vu[i]>=2)
{
vin=vu[i]/2;
vu[i]=vu[i]%2;
}
}
int vun=Weishu(vu);
if(vin==1) vu[vun]=vin;
return(vu);
}
void main()
{
int i,n=0,*Mult;
char ch;
using namespace std;
#define M 100
#define N 100
ifstream infile;
ofstream outfile;
int Weishu(int u[]);
int *add(int *m,int *n);
int *Mul(int n,int *u,int *v);
大整数乘法问题
一、
(1)采用分治法的思想,将一个多位的二进制数分成几个位数较少的二进制数进行计算。这样不断地往下分,直到分出的二进制数相对简单,可以直接算出来。
(2)对于这个算法,上课时讲过了时间复杂度为O(n^1.59)。
二
(1)具体程序代码(c++)
#include<fstream>
#include<iostream>
}
i=0;
cc=Mul(n/2,x,y);
while(*cc==1 || *cc==0)
{
c[i]=*cc;
*cc++;
i++;
}
i=0;
dd=Mul(n/2,x,z);
while(*dd==1 || *dd==0)
{
d[i]=*dd;
*dd++;
i++;
}
j=0;
int an=Weishu(a);
for(i=an-1;i>=0;i--) wy[j++]=a[i];
j=0;
int bn=Weishu(b);
for(i=bn-1;i>=0;i--) wz[j++]=b[i];
j=0;
int cn=Weishu(c);
for(i=cn-1;i>=0;i--) xy[j++]=c[i];
j=0;
int dn=Weishu(d);
问题规模很大时可能会出问题。
(2)如果不用XXX方法还能想到其他的解决方式吗?和XXX方法相比会有更好的效率吗?
不使用分治法,还可以进行高精度乘法或转化为十进制乘法。
(3)所选用的数据结构合适吗?
该算法使用的数据结构比较少。
(4)该算法都存在哪几类可能出现的情况,你的测试完全覆盖了你所想到的这些情况吗,测试结果如何?
for(i=dn-1;i>=0;i--) xz[j++]=d[i];
int ann=Weishu(wy);
for(i=ann-1;i>=0;i--) wy[i+n]=wy[i];
for(i=0;i<n;i++) wy[i]=0;
int *s1,s11[M];
s1=add(wz,xy); j=0;
while(*s1==1 || *s1==0)
while(*s2==1 || *s2==0)
{
s22[j]=*s2;
j++;
*s2++;
}//s22=wy/2^n+(wz+xy)/2^(n/2)
int *s;
s=add(xz,s22);
j=0;i=0;
int ss[M];
while(*s==1 || *s==0)
{
ss[j]=*s;
j++;
*s++;
int sn=Weishu(ss),sum[M];
j=0;
for(i=sn-1;i>=0;i--)
{
sum[j]=ss[i];
j++;
}
return (sum);
}
}
int *add(int *u,int *v)
{int vn=Weishu(v),vin=0;
int j=0,i;
infile>>n;
Mult=Mul(n,U,V);
n=0;
while(*Mult==1 || *Mult==0)
{
mult[n++]=*Mult;
*Mult++;
}
for(i=0;i<n;i++) outfile<<mult[i];
outfile<<endl;
infile.close();
outfile.close();
y[i]=v[i];
z[i]=v[i+mid];
}
i=0;
aa=Mul(mid,w,y);
while(*aa==1 || *aa==0)
{
a[i]=*aa;
*aa++;
i++;
}
i=0;
bb=Mul(n/2,w,z);
while(*bb==1 || *bb==0)
{
b[i]=*bb;
*bb++;
i++;
int Weishu(int u[])
{
int t=0;
while(u[t]==1 || u[t]==0){
t++;
}
return t;
}
int *Mul(int n,int *u,int *v)
{
int w[M],x[M],y[M],z[M];
int a[M],b[M],c[M],d[M];
int wy[M],xz[M],wz[M],xy[M];
{
s11[j]=*s1;
j++;
*s1++;
}//s11=wz+xy
int sn1=Weishu(s11);
for(i=sn1-1;i>=0;i--) s11[i+n/2]=s11[i];
for(i=0;i<n/2;i++) s11[i]=0;
int *s2,s22[M];
s2=add(s11,wy);j=0;
int *aa,*bb,*cc,*dd;
int mid;
int i,j;
int Ji[M],k=0;
if(n==1)
{
Ji[k]=u[0]*v[0];
k++;
return(Ji);
}
else
{
mid=(n+1)/2;
for(i=0;i<mid;i++)
{
w[i]=u[i];
x[i]=u[i+mid];
计算的数据规模不能太大。
(5)叙述通过实验你对XXX方法的理解及其优缺点。
通过本次实验使我进一步理解了分治递归的思想。认识到利用分治的关键是递归思路的清晰,用递归编写的程序很简单。用分治递归思想编写程序能把大问题变为小问题,而且不需要考虑一些细节问题,总之在碰到过程非常复杂的时候,又能用分治递归解决的问题时,用分治递归是一个很好的方法。。
int c[M],vu[M];
int un=Weishu(u);
for(i=0;i<un;i++){
vu[i]=v[i]+u[i]+vin;
if(v[i]==1 && u[i]==1);
else vin=0;
if(vu[i]>=2){
vin=vu[i]/2;
vu[i]=vu[i]%2;
}
}
for(i=un;i<vn;i++)
int U[M],V[M],mult[M];
infile.open("input.txt",ios::in);
outfile.open("output.txt",ios::out);
while((ch=infile.get())!=' ') U[n++]=ch-48;
n=0;
while((ch=infile.get())!='\n') V[n++]=ch-48;
}
(2)
调试中出现的问题:一开始并不是任意两个四位数相乘都可以得到正确结果,原因是我把待相乘的两个数定义为整型,递归函数的返回类型也定义为int,发现结果不对。后来通过将其定义为长整型,递归函数的返回类型也定义为long型才能够完成在计算机允许的数据范围内完成两个大整数的相乘。
三
回答以下问题:
(1)算法实现的复杂度在问题规模很大时可以接受吗?
{
vu[i]=v[i]+vin;
vin=来自百度文库;
if(vu[i]>=2)
{
vin=vu[i]/2;
vu[i]=vu[i]%2;
}
}
int vun=Weishu(vu);
if(vin==1) vu[vun]=vin;
return(vu);
}
void main()
{
int i,n=0,*Mult;
char ch;
using namespace std;
#define M 100
#define N 100
ifstream infile;
ofstream outfile;
int Weishu(int u[]);
int *add(int *m,int *n);
int *Mul(int n,int *u,int *v);
大整数乘法问题
一、
(1)采用分治法的思想,将一个多位的二进制数分成几个位数较少的二进制数进行计算。这样不断地往下分,直到分出的二进制数相对简单,可以直接算出来。
(2)对于这个算法,上课时讲过了时间复杂度为O(n^1.59)。
二
(1)具体程序代码(c++)
#include<fstream>
#include<iostream>
}
i=0;
cc=Mul(n/2,x,y);
while(*cc==1 || *cc==0)
{
c[i]=*cc;
*cc++;
i++;
}
i=0;
dd=Mul(n/2,x,z);
while(*dd==1 || *dd==0)
{
d[i]=*dd;
*dd++;
i++;
}
j=0;
int an=Weishu(a);
for(i=an-1;i>=0;i--) wy[j++]=a[i];
j=0;
int bn=Weishu(b);
for(i=bn-1;i>=0;i--) wz[j++]=b[i];
j=0;
int cn=Weishu(c);
for(i=cn-1;i>=0;i--) xy[j++]=c[i];
j=0;
int dn=Weishu(d);
问题规模很大时可能会出问题。
(2)如果不用XXX方法还能想到其他的解决方式吗?和XXX方法相比会有更好的效率吗?
不使用分治法,还可以进行高精度乘法或转化为十进制乘法。
(3)所选用的数据结构合适吗?
该算法使用的数据结构比较少。
(4)该算法都存在哪几类可能出现的情况,你的测试完全覆盖了你所想到的这些情况吗,测试结果如何?
for(i=dn-1;i>=0;i--) xz[j++]=d[i];
int ann=Weishu(wy);
for(i=ann-1;i>=0;i--) wy[i+n]=wy[i];
for(i=0;i<n;i++) wy[i]=0;
int *s1,s11[M];
s1=add(wz,xy); j=0;
while(*s1==1 || *s1==0)
while(*s2==1 || *s2==0)
{
s22[j]=*s2;
j++;
*s2++;
}//s22=wy/2^n+(wz+xy)/2^(n/2)
int *s;
s=add(xz,s22);
j=0;i=0;
int ss[M];
while(*s==1 || *s==0)
{
ss[j]=*s;
j++;
*s++;