首页 > 代码库 > 大数开根
大数开根
#include <stdio.h> #include <string.h> #include <stdlib.h> #define DEPTH 10 typedef int BigInteger[10100]; int comp(const BigInteger a,const int c,const int d,const BigInteger b) //大数比较 { int i,t=0,O=-DEPTH*2; if(b[0]-a[0]<d&&c) return 1; for(i=b[0];i>d;i--) { t=t*DEPTH+a[i-d]*c-b[i]; if(t>0) return 1; if(t<O) return 0; } for(i=d;i;i--) { t=t*DEPTH-b[i]; if(t>0) return 1; if(t<O) return 0; } return t>0; } void sub(BigInteger a,const BigInteger b,const int c,const int d) //大数减 { int i,O=b[0]+d; for(i=1+d;i<=O;i++) if((a[i]-=b[i-d]*c)<0) a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH; for(;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++); for(;!a[a[0]]&&a[0]>1;a[0]--); } void Sqrt(BigInteger b,BigInteger a) //开平方 { int h,l,m,i; memset((void*)b,0,sizeof(BigInteger)); for(i= b[0]=(a[0]+1)>>1;i;sub(a,b,m,i-1),b[i]+=m,i--) for(h=DEPTH-1,l=0,b[i]=m=(h+l+1)>>1;h>l;b[i]=m=(h+l+1)>>1) if(comp(b,m,i-1,a)) h=m-1; else l = m; for(;!b[b[0]]&&b[0]>1;b[0]--); for (i = 1; i <= b[0]; b[i++] >>= 1); } char str[10100]; BigInteger a,b; int main() { int t; scanf("%d", &t); while(t--) { scanf("%s",str); a[0]=strlen(str); for(int i=1; i<=a[0]; i++) a[i]=str[a[0]-i]-‘0‘; Sqrt(b,a); for(int i=b[0]; i>=1; i--) printf("%d",b[i]); printf("\n"); if(t) puts(""); } return 0; }
http://blog.csdn.net/acdreamers/article/details/8885090
http://blog.csdn.net/hondely/article/details/6939895
大数开根
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。