高精度_大整数开根
来源:互联网 发布:为什么联通4g网络很差 编辑:程序博客网 时间:2024/05/04 23:40
二分法
#include<iostream>#include<string>#include<algorithm>using namespace std;int n,nlen;char str[22];int c[1000];int a[1000],b[1000],d[1000];int isok(int len){ memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); int i,j,t; t=2*(len-1); //t 是小数的位数 for(j=0,i=len-1;i>=0;i--) { a[j++]=c[i]; } for(i=0;i<len;i++) { for(j=0;j<len;j++) { b[i+j]+=a[i]*a[j]; } } len=2*len-1; for(i=0;i<len;i++) { b[i+1]+=b[i]/10; b[i]%=10; } while(b[len]) { b[len+1]+=b[len]/10; b[len]%=10; len++; } if(len-t<nlen) //整数位数小于给定的N的长度,则返回小于 return -1; if(len-t>nlen) //返回大于 return 1; for(i=len-1,j=nlen-1;i>=0 && j>=0;i--,j--) { if(d[j]>b[i]) return -1; if(d[j]<b[i]) return 1; } while(i>=0) { if(b[i]) //整数部分相等,小数部分有值的话,返回大于 return 1; i--; } return 0; //等于}int main(){ int cas,i; freopen("in.txt","r",stdin); scanf("%d",&cas); while(cas--) { scanf("%d",&n); memset(c,0,sizeof(c)); nlen=0; int l,r,t,mid,tt; t=n; while(t) //将输入的n转化成串的形式,便于比较大小 { d[nlen]=t%10; nlen++; t/=10; } l=1;r=n; int flag=0; //标记是否相等 while(l<=r) //求整数部分 { mid=(l+r)/2; c[0]=mid; tt=isok(1); if(tt>0) { r=mid-1; } else if(tt<0) { t=mid; l=mid+1; } else if(tt==0) { t=mid; flag=1; break; } } c[0]=t; for(i=1;i<120;i++) //模拟开方的前119位小数 { if(flag) //相等的话,就不用继续求了 continue; l=0;r=9; while(l<=r) { mid=(l+r)/2; c[i]=mid; tt=isok(i+1); if(tt>0) { r=mid-1; } else if(tt<0) { t=mid; l=mid+1; } else if(tt==0) { t=mid; flag=1; break; } } c[i]=t; } printf("%d.",c[0]); for(i=1;i<120;i++) printf("%d",c[i]); printf("\n"); } return 0;}
手动开根号的基本方法:
将被开方数从右向左每隔2位用撇号分开;
从左边第一段求得算数平方根的第一位数字;
从第一段减去这个第一位数字的平方,再把被开方数的第二段写下来,作为第一个余数;
把所得的第一位数字乘以20,去除第一个余数,所得的商的整数部分作为试商(如果这个整数部分大于或等于10,就改用9左试商,如果第一个余数小于第一位数字乘以20的积,则得试商0);
把第一位数字的20倍加上试商的和,乘以这个试商,如果所得的积大于余数时,就要把试商减1再试,直到积小于或等于余数为止,这个试商就是算数平方根的第二位数字;
用同样方法继续求算数平方根的其他各位数字
#include <stdio.h> #include <string.h> int l; int work(int o,char *O,int I) { char c, *D=O ; if(o>0) { for(l=0;D[l];D[l++]-=10) { D[l++]-=120; D[l]-=110; while(!work(0,O,l)) D[l]+=20; putchar((D[l]+1032)/20); } putchar(10); } else { c=o+(D[I]+82)%10-(I>l/2)*(D[I-l+I]+72)/10-9; D[I]+=I<0 ? 0 : !(o=work(c/10,O,I-1))*((c+999)%10-(D[I]+92)%10); } return o; } int main() { char s[1200];s[0]='0'; scanf("%s",s+1); if(strlen(s)%2 == 1) work(2,s+1,0); else work(2,s,0); return 0; }
1 0
- 高精度_大整数开根
- codevs 3119 高精度练习之大整数开根
- codevs3119 高精度练习之大整数开根
- 高精度 大整数加法
- 高精度大整数加法
- 高精度大整数类
- 大整数高精度加减乘除
- 高精度大整数模板
- 【高精度】大整数类
- 高精度(大整数加法)
- 高精度(大整数减法)
- 高精度(大整数除法)
- 高精度(大整数乘法)
- 模板--高精度、大整数幂取模
- sgu112 高精度大整数乘方
- C++高精度大整数模板
- 高精度计算-大整数加减法
- 高精度计算-大整数乘法
- Linux下rename批量改变同文件夹的文件后缀名
- java
- 循环队列(顺序队列)
- ubuntu下添加开机启动项
- 【设计模式】——六原则(二)
- 高精度_大整数开根
- 方案_Vmware虚拟机断电或强制关机后无法启动
- linux 需改环境变量
- MYSQL数据库 初学笔记1
- vb.net 下的sql多表查询问题
- 22条协助您增加工作效率、节约时间的建议
- 单片机通信协议
- kafka消费失败多次重试
- vector容器中删除元素