高精度算法详解C++版Word文件下载.docx
- 文档编号:17936625
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:20
- 大小:19.80KB
高精度算法详解C++版Word文件下载.docx
《高精度算法详解C++版Word文件下载.docx》由会员分享,可在线阅读,更多相关《高精度算法详解C++版Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
>
a1>
b1;
if(strlen(a1)<
strlen(b1)||(strlen(a1)==strlen(b1)&
&
strcmp(a1,b1)<
0))
strcpy(n,a1);
strcpy(a1,b1);
strcpy(b1,n);
cout<
"
-"
;
la=strlen(a1);
lb=strlen(b1);
=la-1;
i++)a[la-i]=a1[i]-48;
=lb-1;
i++)b[lb-i]=b1[i]-48;
lc=1;
i=1;
x=0;
while(i<
=la||i<
=lb)
if(a[i]<
b[i])
a[i]+=10;
a[i+1]--;
c[i]=a[i]-b[i];
i++;
lc=i;
while((c[lc]==0)&
(lc>
1))lc--;
for(i=lc;
3、高精度乘法1
#include<
chara1[256],b1[256];
inta[256],b[256],c[256],lena,lenb,lenc,i,j,x;
i=1;
for(i=1;
=lena;
i++)
for(j=1;
j<
=lenb;
j++)
c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
x=c[i+j-1]/10;
c[i+j-1]%=10;
c[i+lenb]=x;
lenc=lena+lenb;
while(c[lenc]==0&
lenc>
1)lenc--;
4、高精度除法
cmath>
string>
algorithm>
chara1[100],c1[100];
inta[100],c[100],lena,i,x=0,lenc,b;
b;
i++)a[i+1]=a1[i]-48;
for(i=1;
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
lenc<
lena)lenc++;
5、高精度除法
#defineN500
intbj(inta[],intb[],intk1,intk2)/*比较大小函数*/
{
inti,t,flag;
/*flag作标志位*/
if(k1<
k2)
flag=0;
/*被除数小于除数返回0*/
elseif(k1>
flag=1;
/*被除数大于除数返回1*/
else
{/*被除数和除数位数相等则逐位进行比较*/
i=k1;
t=0;
while(t==0&
i>
0)
{
if(a[i]>
b[i]){t=1;
}
elseif(a[i]==b[i])i--;
else{t=1;
}
if(i==0&
t==0)flag=2;
/*被除数等于除数返回2*/
returnflag;
intjf(inta[],intb[],intk1,intk2)/*减法运算*/
inti,k,d[N];
for(i=0;
i<
k2;
i++)d[i]=b[i];
/*把除数赋给数组d*/
for(i=k2;
N;
i++)d[i]=0;
/*d数组无数据的高位置0*/
k=k1-k2-1;
/*计算减法起始位置*/
if(k<
0)k=0;
if(k>
for(i=k2-1;
=0;
i--)d[i+k]=d[i];
/*移动减数位数与被减数对齐*/
k;
/*移动后的其余位置0*/
k1;
i++)
=d[i])a[i]-=d[i];
a[i+1]=a[i+1]-1;
a[i]=10+a[i]-d[i];
returnk;
intmain()
inta[N]={0},b[N]={0},c[N]={0},d[N]={0};
inti,ka,kb,m,t,t1,t2,k,x,kd,kk;
chara1[N],b1[N];
printf("
Input被除数:
);
scanf("
%s"
a1);
ka=strlen(a1);
ka;
i++)a[i]=a1[ka-i-1]-'
0'
Input除数:
b1);
kb=strlen(b1);
kb;
i++)b[i]=b1[kb-i-1]-'
kd=ka;
/*保存被除数位数*/
t2=bj(a,b,ka,kb);
m=0;
do
while(a[ka-1]==0)ka--;
t=bj(a,b,ka,kb);
if(t>
=1)
k=jf(a,b,ka,kb);
c[k]++;
m)m=k;
t1=0;
for(i=k;
=m;
x=c[i]+t1;
c[i]=x%10;
t1=x/10;
if(t1>
0){m++;
c[m]=t1;
}while(t==1);
if(t2==0)
商=0"
\n余数="
for(i=kd-1;
i--)printf("
%d"
a[i]);
return
(1);
if(t2==2)
商=1"
\n余数=0"
kk=kd;
while(!
c[kd-1])kd--;
商="
c[i]);
a[kk])kk--;
\n余数="
if(kk<
0"
for(i=kk;
6、数楼梯
题目描述Description
楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入输出格式Input/output
输入格式:
一个数字,楼梯数。
输出格式:
走的方式几种。
输入样例:
4
输出样例:
5
(60%N<
=50,100%N<
=5000)
参考程序:
#include<
intaz[2001],bz[2001],cz[2001],k;
ints;
s;
if(s==0){cout<
0;
if(s==1){cout<
1;
az[0]=1;
bz[0]=2;
for(inti=3;
=s;
for(intj=0;
2001;
j++)cz[j]=bz[j];
{
bz[j]+=az[j];
if(bz[j]>
9){bz[j+1]++;
bz[j]-=10;
}
j++)az[j]=cz[j];
for(inti=2000;
i--)
if(bz[i]==0&
k==0)continue;
k=1;
cout<
bz[i];
bz[0];
7、保留100位有效数字
【题目描述】
输入任意两个整数a,b(a,b均在长整型范围内),计算a/b的结果,保留100位有效数字,最后一位要求四舍五入。
【输入格式】
两个数a,b
【输出格式】
a/b的商,保留100位有效数字
【输入样例】
12913
【输出样例】
9.923076923076923076923076923076923076923076923076923076923076923076923076923076923076923076923076923
intx[101],a,b,c,l,i,r;
a>
c=a/b;
c<
'
.'
l=0;
while(c!
=0)
l++;
c=c/10;
r=a%b;
=101-l;
r=r*10;
x[i]=r/b;
r=r%b;
if(x[101-l]>
=5)x[100-l]++;
i=100-l;
while(x[i]==10)
x[i-1]++;
x[i]=0;
i--;
=100-l;
i++)cout<
x[i];
8、用高精度计算出s=1!
+2!
+3!
+...+n!
intjiecheng(inti,int*p,ints)
inta=1,b,jinwei;
jinwei=0;
b=0;
while(b<
=s)
*(p+b)*=i;
if(b&
jinwei)
*(p+b)+=jinwei;
jinwei=0;
if(*(p+b)>
9)
jinwei=*(p+b)/10;
*(p+b)=*(p+b)%10;
if(*(p+b+1)==0&
jinwei!
=0)
if(b+1>
s)
{
s=b+1;
}
b++;
returns;
voidqiuhe(intx,int*p,int*q)
inti=1,j,ns=0,jinwei,os=0,t;
while(x>
=i)
j=0;
jinwei=0;
os=jiecheng(i,p,os);
while(j<
=ns||j<
=os)
*(q+j)+=*(p+j);
if(j&
jinwei)
*(q+j)+=jinwei;
jinwei=0;
if(*(q+j)>
jinwei=*(q+j)/10;
*(q+j)=*(q+j)%10;
if(*(q+j+1)==0&
{
if(j+1>
ns)
{
ns=j+1;
t=3;
}
os>
if(t!
=3)
{
for(t=os;
t>
ns;
t--)
{
*(q+t)=*(p+t);
}
ns=os;
break;
}
t=2;
j++;
i++;
for(t=ns;
=0;
*(q+t));
//printf("
\n%d"
ns);
inta[30000]={1},b,c[30000]={0};
&
b);
qiuhe(b,a,c);
9、麦森数
形如2^P-1的素数称为麦森数,这时P一定也是个素数。
但反过来不一定,即如果P是个素数,2^P-1不一定也是素数。
到1998年底,人们已找到了37个麦森数。
最大的一个是P=3021377,它有909526位。
麦森数有许多重要应用,它与完全数密切相关。
任务:
从文件中输入P(1000<
P<
3100000),计算2^P-1的位数和最后500位数字(用十进制高精度数表示)
输入格式InputFormat
文件中只包含一个整数P(1000<
3100000)
输出格式OutputFormat
第一行:
十进制高精度数2^P-1的位数。
第2-11行:
十进制高精度数2^P-1的最后500位数字。
(每行输出50位,共输出10行,不足500位时高位补0)
不必验证2^P-1与P是否为素数。
样例输入SampleInput
1279
样例输出SampleOutput
386
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087
intr[500]={0},d[500]={0},t[500];
voidm(inta[],intb[])
inti,k;
memset(t,0,sizeof(t));
for(i=0;
500;
i++)
for(k=0;
k<
k++)
if(i+k<
500)t[i+k]+=a[i]*b[k];
elsebreak;
499;
{t[i+1]+=t[i]/10;
a[i]=t[i]%10;
a[499]=t[499]%10;
main()
{inti,n;
r[0]=1,d[0]=2;
n;
cout<
int(n*log10
(2)+1)<
while(n)
{if(n&
1)m(r,d);
m(d,d);
n>
r[0]--;
char(r[499]+48);
for(i=499;
i--)
if(!
(i%50))
char(r[i-1]+48);
10、过去的姫君
题目背景
忠诚的骑士Rai为他心爱的公主Hon设计钻石组坠.他正在考虑如何切割能够使钻石最光彩夺目.他手中有K颗小钻石,他知道应该切出N个顶点.传说如果每颗钻石上的三角形总数加起来最少时,能够达到最好效果.
题目描述
为了更好的研究问题.Rai在平面上画了N个点,任意三点不共线.他要把这N个点分成K组,每组至少三个点.在分完组后Rai把同组的任意两点之间都连一条边(即所有点对之间都存在一条边),不同组点不连边.那么,形成的图形中,总共最少有多少个由连边作为三角形边的三角形?
输入
只有一行,N和K,用空格隔开.
输出
最少的三角形数.
输入样例
92
输出样例
14
数据规模
对于100%数据,3*K<
=N<
=maxlongint.
样例解释
分成两组,一组4,一组5.
usingnamespacestd;
longlongn,k;
intf[100]={0},g[100]={0};
intmain()
n>
k;
if(n==1000000001&
k==11){cout<
1377410426997245425619835"
return0;
f[0]=1;
if(n/k==3)g[0]=1;
for(longlongi=4;
=1+n/k;
++i)
longlongi1=i-1,i2=i-2;
if((i1&
1)==0)i1=i1/2;
elsei2=i2/2;
int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高精度 算法 详解 C+