算法大整数的四则运算Word格式.docx

上传人:b****6 文档编号:22146077 上传时间:2023-02-02 格式:DOCX 页数:27 大小:289.16KB
下载 相关 举报
算法大整数的四则运算Word格式.docx_第1页
第1页 / 共27页
算法大整数的四则运算Word格式.docx_第2页
第2页 / 共27页
算法大整数的四则运算Word格式.docx_第3页
第3页 / 共27页
算法大整数的四则运算Word格式.docx_第4页
第4页 / 共27页
算法大整数的四则运算Word格式.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

算法大整数的四则运算Word格式.docx

《算法大整数的四则运算Word格式.docx》由会员分享,可在线阅读,更多相关《算法大整数的四则运算Word格式.docx(27页珍藏版)》请在冰豆网上搜索。

算法大整数的四则运算Word格式.docx

UpdateData();

intlen_op1,len_op2;

//存放两个字符串长度且len_op1存放较长字符串的长度

len_op1=m_operate1.GetLength();

len_op2=m_operate2.GetLength();

if(len_op1<

len_op2)//若m_operate1长度小于m_operate2长度交换两字符串

{

CStringtemp;

temp=m_operate1;

m_operate1=m_operate2;

m_operate2=temp;

inthu;

hu=len_op1;

len_op1=len_op2;

len_op2=hu;

}

m1=len_op1/6;

//m1是m_operate1所用数组的长度

if(len_op1%6!

=0)

m1++;

m2=len_op2/6;

//m2是m_operate2所用数组的长度

if(len_op2%6!

m2++;

intt1=0;

for(inti=len_op1-1;

i>

0;

i=i-6)

{//数组的每个元素存放6个字符串

if(i>

5)//num1中存放较长的字符串m_operate1

{

num1[t1]=atoi(m_operate1.Mid(i-5,6));

t1++;

}

else

break;

}

if(t1!

=m1)

num1[t1]=atoi(m_operate1.Mid(0,i+1));

intt2=0;

for(intj=len_op2-1;

j>

j=j-6)

{//num2存放字符串m_operate2

if(j>

5)

num2[t2]=atoi(m_operate2.Mid(j-5,6));

t2++;

break;

if(t2!

=m2)

num2[t2]=atoi(m_operate2.Mid(0,j+1));

}

OnButtonAdd()

{

intjin,i,j;

//jin存储进位

CStringaa,bb;

//存放输出的值

aa=bb="

"

;

jin=0;

for(i=0;

i<

100;

i++)

{//初始化

num1[i]=num2[i]=hen[i]=0;

ChangeToInt();

//将字符型大整数转化为整数数组存储

for(j=0;

j<

m1;

j++)

{//从低位开始相加每位都当成有进位处理

hen[j]=num1[j]+num2[j]+jin-1000000;

if(hen[j]>

=0)//有进位

jin=1;

else//没有进位修正hen[j]的值

hen[j]=num1[j]+num2[j]+jin;

jin=0;

}

}

if(jin==1)//处理最高位的进位

hen[j]=1;

else

j--;

//输出结果

aa.Format("

%d"

hen[j]);

for(intl=j-1;

l>

=0;

l--)

if(hen[l]<

10)

{

bb.Format("

hen[l]);

bb="

00000"

+bb;

elseif(hen[l]<

100)

0000"

1000)

000"

10000)

00"

100000)

0"

else

{bb.Format("

}

aa+=bb;

MessageBox(aa);

7:

使用方法,如如何启动程序,关闭程序,对输入输出要求

可输入两个非负的大整数进行运算。

8:

测试数据数据及结果说明(正确数据以及非正确数据)

正确数据:

错误数据:

说明:

没有在输入大整数时判断正负。

9:

总结(如调试过程中遇到的问题算法策略;

算法的方法)

输出时按照,存放和的数组hen[],由高位到低位输出,数组中除最高位的一位并没有达到6位时如123应该输出000123而不是123.。

解决方法判断大小在数前加0。

二:

实验题目

大整数减法

1:

问题分析

处理多位整数的减法,这些整数无法在计算机硬件允许的范围内表示和处理。

将输入的两个大整数处理为位数较多的一个减去位数较少的一个,若被减数比减数位数少结果前面加“-”。

Num1[],num2[]存放被减数和减数。

cha[]存放差,jie表示借位。

则cha[i]=num1[i]-num2[i]-jie;

jie为低位是否向此位借位。

若cha[i]<

0则修正为cha[i]+=1000000;

且jie=1。

算法策略的选择:

采用蛮力法。

Y

OnButtonCut()

{//实现两个大整数的减法

for(intq=0;

q<

q++)

num1[q]=num2[q]=cha[q]=0;

boolcomp=0;

//若comp为0则m_operate1大于或等于m_oprate2若为1则相反

if(len_op2>

len_op1)

comp=1;

intjie=0;

for(inti=0;

cha[i]=num1[i]-num2[i]-jie;

if(cha[i]<

0&

&

(i!

=m1-1))

jie=1;

cha[i]+=1000000;

jie=0;

intbegin=0;

//从高位到低位找到cha[]中第一位部位0的下标几位begin

for(intp=99;

p>

p--)

if(cha[p]!

begin=p;

}

cha[begin]);

for(intl=begin-1;

if(cha[l]<

cha[l]);

elseif(cha[l]<

if(comp)

aa="

-"

+aa;

输入两个非负数的大整数的减法。

未考虑负数大整数相减的情况。

相减的结果课能为0,但结果是存在数组中的,判断是否为0应从最高为一次检验数组中的每一位。

三:

大数乘法

处理多位整数的加法,这些整数无法在计算机硬件允许的范围内表示和处理。

考虑,大整数与正常较小的数相乘,和两个大整数相乘。

采用长整形数组存放大整数,每位数组存放4位。

ji[]存放积。

Num2[]数组中的元素依次从低位到高位(相应大整数的低位到高位)当成正常整数与数组num1[]的每一位相乘。

jin表示进位。

结果存放在buffer[]数组中。

将buffer[]中的元素乘以相应的权值赋值给ji[]数组。

采用蛮力法

y

ChangeToInt4()

{//将字符串表示的长整数转化为长整形数组表示,每位数组存放4位。

//

len_op2)

m1=len_op1/4;

if(len_op1%4!

m2=len_op2/4;

if(len_op2%4!

i=i-4)

3)

num1[t1]=atoi(m_operate1.Mid(i-3,4));

elsebreak;

j=j-4)

{num2[t2]=atoi(m_operate2.Mid(j-3,4));

OnButtonMulti()

i++)//初始化

num1[i]=num2[i]=ji[i]=buffer[i]=0;

ChangeToInt4();

//将字符串表示的大整数存入长整形数组

for(intt1=0;

t1<

m2;

t1++)//num2[t1]作为一个非大整数与数组num1[]表示的长整数相乘

SingleMul(num1,num2[t1],t1);

intbegin;

for(intj=99;

j--)

if(ji[j]!

{begin=j;

break;

}

aa=bb="

ji[begin]);

if(ji[l]<

ji[l]);

bb="

elseif(ji[l]<

{bb.Format("

}

else{bb.Format("

输入两个非负的的大整数的乘法

未考虑负数参与乘法运算的情况。

将两个大数相乘的情况,分解为非大整数与大整数相乘,最终分解为两个非大整数相乘,再将所的的结果用加法整合在一起,要注意相应的权值体现在数组的下表上。

四:

大整数除法

处理多位整数的除法,这些整数无法在计算机硬件允许的范围内表示和处理。

一个较大的大整数除以一个整数,先把除数乘以相应的权值(在后面加0)使它成为小于被除数的最大的数。

则用被除数减去除数,直到被除数小于除数,记录减去的次数,则这个次数就为商,剩余的被除数就为余数。

采用蛮力法

intCBigCountDlg:

Jian(intl,intlon)//从被除数中减去除数

{intbuffer[100]={0};

intdi=l-lon+1;

//di记录被除数与除数开始相减的位数

len_da2;

{buffer[di+i]=data1[di+i]-data2[i]-jie;

if(buffer[di+i]<

0)

{buffer[di+i]+=10;

jie=1;

elsejie=0;

if(jie>

lon==len_da2)//此时从被除数中取到的与除数相同长度的一段比除数小

return-1;

//返回-1将除数较于被除数后撤一位在相减

else//此时将buffer新负的值传给被除数

buffer[di+i]=data1[di+i]-jie;

for(intj=l-lon+1;

=l-lon+1+len_da2;

data1[j]=buffer[j];

intxiao=0;

//记录被除数的长度减少多少

for(intk=len_da1-1;

k--)

{if(data1[k]==0)

xiao++;

elsebreak;

len_da1-=xiao;

return1;

OnButtonDive()

{for(intk=0;

k<

k++)

{//初始化

num1[k]=num2[k]=count[k]=0;

len_da1=m_operate1.GetLength();

len_da2=m_operate2.GetLength();

len_da1;

{//每位存储一位

data1[len_da1-i-1]=atoi(m_operate1.Mid(i,1));

for(intj=0;

data2[len_da2-j-1]=atoi(m_operate2.Mid(j,1));

intcha,sh,xing;

sh=1;

intl=len_da1-len_da2;

for(inthu=len_da1-1;

hu>

=len_da2-1;

cha=len_da1-len_da2;

xing=Jian(hu,len_da2);

if(xing==-1)

Jian(hu,len_da2+1);

cha--;

count[cha]++;

hu=len_da1-1;

boolbre=0;

if(len_da1<

len_da2)

if(len_da1==len_da2)

for(intt4=len_da2-1;

t4>

t4--)

{

if(data1[t4]<

data2[t4])

{

bre=1;

}//被除数比除数小了,此时被除数的值就为余数

if(bre==1)

CStringresult,yu,bu;

result=yu=bu="

if(count[l]==0)

l--;

for(intt6=l;

t6>

t6--)

bu.Format("

count[t6]);

result+=bu;

for(intt5=len_da1-1;

t5>

t5--)

bu.Format("

data1[t5]);

yu+=bu;

MessageBox("

商为"

+result+"

余数为"

+yu);

实现两个非负大整数的除法运算,得到商和余数。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1