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