大整数加减乘除Word下载.docx
《大整数加减乘除Word下载.docx》由会员分享,可在线阅读,更多相关《大整数加减乘除Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
![大整数加减乘除Word下载.docx](https://file1.bdocx.com/fileroot1/2022-10/29/33b18c4b-6b22-43bc-8e2c-56b461b41cc2/33b18c4b-6b22-43bc-8e2c-56b461b41cc21.gif)
for(inti=s1.size()-1;
i>
=0;
i--)
carry+=s1[i]-'
;
carry+=s2[i]-'
c.insert(c.begin(),carry%10+'
carry/=10;
if(carry>
0)
returnc;
}
大整数减法
stringBigSubtraction(strings1,strings2)
stringresult;
boolFlag=false;
intcarry=0,len1,len2;
if(s1==s2)
{result="
0"
returnresult;
elseif(s1.size()<
s2.size())
swap(s1,s2);
len1=s1.size();
len2=s2.size();
Flag=true;
if(s1.size()==s2.size()&
&
s1<
s2)
{swap(s1,s2);
Flag=true;
if(carry+(s1[i]-'
)-(s2[i]-'
)<
{
carry=carry+10+(s1[i]-'
result.insert(result.begin(),carry+'
carry=-1;
}
else
carry=carry+(s1[i]-'
carry=0;
intf=0;
while(result[f]=='
)
{
result.erase(result.begin());
f++;
if(Flag==true)
result.insert(result.begin(),'
-'
returnresult;
大整数乘法
stringmultiplication(stringstr1,stringstr2)
intmaxsize=200;
//表示计算结果的长度
inta[210],b[210],c[410];
//分别为maxsize+10;
maxsize+10;
maxsize*2+10;
inti;
for(i=0;
i<
i++)a[i]=b[i]=0;
maxsize*2+10;
i++)c[i]=0;
intlen1,len2;
len1=str1.size();
len2=str2.size();
intj;
for(j=0,i=len1-1;
i>
i--)//把数字倒过来
a[j++]=str1[i]-'
for(j=0,i=len2-1;
i--)//倒转第二个整数
b[j++]=str2[i]-'
i<
len2;
i++)//用第二个数乘以第一个数,每次一位
for(j=0;
j<
len1;
j++)
c[i+j]+=b[i]*a[j];
//先乘起来,后面统一进位
maxsize*2;
i++)//循环统一处理进位问题
if(c[i]>
=10)
c[i+1]+=c[i]/10;
c[i]%=10;
stringResult="
"
for(i=maxsize*2;
(c[i]==0)&
(i>
=0);
i--);
//跳过高位的
if(i>
=0)
for(;
Result+=c[i]+'
Result="
returnResult;
大整数除法求商
#defineMAX_LEN200
intan1[MAX_LEN+10];
intan2[MAX_LEN+10];
intaResult[MAX_LEN+10];
intSubstract(int*p1,int*p2,intnLen1,intnLen2)
if(nLen1<
nLen2)
return-1;
if(nLen1==nLen2)
for(i=nLen1-1;
i>
=0;
i--)
if(p1[i]>
p2[i])break;
elseif(p1[i]<
p2[i])return-1;
for(i=0;
i<
nLen1;
i++)
p1[i]-=p2[i];
if(p1[i]<
0)
p1[i]+=10;
p1[i+1]--;
for(i=nLen1-1;
=0;
i--)
if(p1[i])
returni+1;
return0;
stringDivision(strings1,strings2)
inti,j;
intnLen1=s1.size();
memset(an1,0,sizeof(an1));
memset(an2,0,sizeof(an2));
memset(aResult,0,sizeof(aResult));
for(j=0,i=nLen1-1;
i>
i--)
an1[j++]=s1[i]-'
intnLen2=s2.size();
for(j=0,i=nLen2-1;
an2[j++]=s2[i]-'
nLen2)
Result="
returnResult;
intnTimes=nLen1-nLen2;
if(nTimes>
0)
for(i=nLen1-1;
=nTimes;
an2[i]=an2[i-nTimes];
for(;
i--)
an2[i]=0;
nLen2=nLen1;
for(j=0;
j<
j++)
intnTmp;
while((nTmp=Substract(an1,an2+j,nLen1,nLen2-j))>
=0)
nLen1=nTmp;
aResult[nTimes-j]++;
for(i=MAX_LEN;
(i>
=0)&
(aResult[i]==0);
i--);
if(i>
=0)
Result+=aResult[i]+'
求N!
#include<
stdio.h>
math.h>
intmain()
longm,i,j,a[10000],n,c;
while(scanf("
%ld"
&
n)>
a[0]=1;
m=0;
for(i=1;
=n;
i++)
c=0;
=m;
a[j]=a[j]*i+c;
c=a[j]/10000;
a[j]%=10000;
if(c>
m++;
a[m]=c;
printf("
a[m]);
for(i=m-1;
%4.4ld"
a[i]);
\n"
Floyd(任意两点间的最短距离)
//别人的测试代码六度分离
string.h>
iostream>
usingnamespacestd;
#defineN110
#defineMAX
intg[N][N][N],path[N][N];
intn,m;
voidfloyd()
for(intk=1;
k<
k++)
for(inti=1;
for(intj=1;
{
g[k][i][j]=g[k-1][i][j];
if(g[k][i][j]>
g[k-1][i][k]+g[k-1][k][j])
{
g[k][i][j]=g[k-1][i][k]+g[k-1][k][j];
}
}
%d%d"
n,&
m)!
=EOF)
inti;
for(i=1;
if(i==j)
g[0][i][j]=g[0][j][i]=0;
else
g[0][i][j]=g[0][j][i]=MAX;
for(i=0;
m;
intx,y;
scanf("
x,&
y);
g[0][x+1][y+1]=g[0][y+1][x+1]=1;
floyd();
i