problem

高精度开根号

  • 输入一个数
  • 求平方根

solution

  • 二分答案,如果mid*mid>原数就去找更小的,反之找更大的。
  • 精度小于二忽略不计?
  • 用到高精加,高精乘,加低精,除低精,比较大小这几个。

放弃调试,明天重写。
mmp

codes1(更快的AC版本

//二分答案
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const int maxn = 1010;
int a[maxn], l[maxn], r[maxn], m[maxn], t[maxn];
//m=l+r>>1
void mid(){//m = l;memcpy(m,l,sizeof(l));//m += r;m[0] = r[0]+1;for(int i = 1; i <= r[0]; i++){m[i] += r[i];if(m[i]>=10){m[i] %= 10;m[i+1]++;}}while(m[0]>1 && m[m[0]]==0)m[0]--;//m /= 2;for(int i = m[0]; i >= 1; i--){if(i > 1)m[i-1]+=m[i]%2*10;m[i] /= 2;}while(m[0]>1 && m[m[0]]==0)m[0]--;
}
//return m*m>a;
bool C(){//t = 0;memset(t,0,sizeof(t));//t = m*m;for(int i = 1; i <= m[0]; i++)for(int j = 1; j <= m[0]; j++)t[i+j-1] += m[i]*m[j];t[0] = m[0]*2;for(int i = 1; i <= t[0]; i++){//处理进位t[i+1] += t[i]/10;t[i] %= 10;}while(t[0]>1 && t[t[0]]==0)t[0]--;//return t>a;if(t[0] != a[0])return t[0]>a[0];for(int i = t[0]; i >= 1; i--)if(t[i]!=a[i])return t[i]>a[i];return 0;
}int main(){//输入string s;  cin>>s;a[0] = s.size();for(int i = 1; i <= a[0]; i++)a[i] = s[a[0]-i]-'0';//二分l[0] = 1;r[0] = a[0]/2+2;r[r[0]] = 1;for(int i = 1; i <= 2000; i++){mid();  //m=l+r>>1;if(C())memcpy(r,m,sizeof(m));//r=m;else memcpy(l,m,sizeof(m));//l=m;}//输出for(int i = l[0]; i >= 1; i--)cout<<l[i];return 0;
}

code2(更容易读懂被TLE一个点的版本

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 2010;
struct Bigint{ int len, num[maxn]; };//return a+b;
Bigint add(Bigint a, Bigint b){Bigint ans;  memset(ans.num,0,sizeof(ans.num));ans.len = max(a.len,b.len)+1;for(int i = 1; i <= ans.len; i++){ans.num[i] += a.num[i]+b.num[i];ans.num[i+1] += ans.num[i]/10;ans.num[i] %= 10;}while(ans.len>1 && ans.num[ans.len]==0)ans.len--;return ans;
}
//return (a+b)/2;
Bigint avg(Bigint a, Bigint b){Bigint ans;  memset(ans.num,0,sizeof(ans.num));ans = add(a,b);//copy fromfor(int i=ans.len;i>=2;i--){ans.num[i-1]+=( ans.num[i]%2)*10; ans.num[i]/=2;}ans.num[1] /= 2;if(ans.num[ans.len]==0)ans.len--;return ans;
}
//return a+2;
Bigint plustwo(Bigint x){x.num[1] += 2;for(int i = 1; i <= x.len; i++){x.num[i+1] += x.num[i]/10;x.num[i] %= 10;}if(x.num[x.len+1]>0)x.len++;return x;
}//return a*b;
Bigint times(Bigint a, Bigint b){Bigint ans;  memset(ans.num,0,sizeof(ans.num));ans.len = a.len+b.len+1;for(int i = 1; i <= a.len; i++)for(int j = 1; j <= b.len; j++)ans.num[i+j-1] += a.num[i]*b.num[j];for(int i = 1; i <= ans.len; i++){ans.num[i+1] += ans.num[i]/10;ans.num[i] %= 10;}while(ans.len>1 && ans.num[ans.len]==0)ans.len--;return ans;
}//return a<=b;
bool over(Bigint a, Bigint b){if(a.len != b.len)return a.len < b.len;for(int i = a.len; i >= 1; i--)if(a.num[i] != b.num[i])return a.num[i]<b.num[i];return true;
}Bigint l, r, mid, tmp;
int main(){ios::sync_with_stdio(false);string s;  cin>>s;tmp.len = s.size();for(int i = 1; i <= tmp.len; i++)tmp.num[i] += s[tmp.len-i]-'0';l.len = 1, l.num[1] = 3; r = tmp;do{mid = avg(l,r);if(!over(times(mid,mid),tmp))r = mid;else l = mid;}while(over(plustwo(l),r)); //l+2<=r;/*for(int i = 1; i <= 1500; i++){mid = avg(l,r);if(!over(times(mid,mid),tmp))r = mid;else l = mid;}*/for(int i = l.len; i >= 1; i--)cout<<l.num[i];/*mid = times(l,r);for(int i = mid.len; i >= 1; i--)cout<<mid.num[i];  cout<<'\n';*/return 0;
}

【codevs3119】高精度开根号(二分答案)相关推荐

  1. 两种方法对浮点数开根号(二分法和牛顿法,含证明)

    二分法和牛顿法求根号是面试中的经典题,如果没提前接触过,经典题将成为经典难题.我先上代码,后面再对代码进行解释: #include<iostream> #include<string ...

  2. 【数学】手写开根号(牛顿迭代法 | 二分)

    题目链接 [编程题]开根号 题面 在没有任何数学库函数的情况下,求一个数 m 开 n 次方的结果. 输入描述: 每组输入只有1行,包括有一个正实数m和一个正整数n,其中1<=n<=321 ...

  3. 二分和牛顿法实现开根号

    二分法: 二分的思想很直观,就不断做折半,但这里注意需要设置一个精度来替代0,由于开根号并不一定保证能够开方取尽.这里取limit = 0.00002. 牛顿法: 设r是f(x) = 0的根,选取x0 ...

  4. [2019.3.4]BZOJ1213 [HNOI2004]高精度开根

    首先你需要一个python高精度模板. 然后二分答案,快速幂判断就好了. 设被开根数\(n\)有\(b\)位. 发现朴素的高精度乘法是\(O(b^2)\)的,所以我们考虑优化 你可以写压位高精(我最后 ...

  5. 【HNOI2004】【BZOJ1213】高精度开根

    Description 晓华所在的工作组正在编写一套高精度科学计算的软件,一些简单的部分如高精度加减法.乘除法早已写完了,现在就剩下晓华所负责的部分:实数的高精度开m次根.因为一个有理数开根之后可能得 ...

  6. 洛谷P1182 数列分段Section II 二分答案

    洛谷P1182 数列分段Section II 二分答案 题意:将 n 个 数 分为 m段 求一种方案,使这m段中最大的和 最小 额..可能有点拗口,其实就是说每一种方案,都有对应的 每段和的最大值, ...

  7. [APIO2018] New Home 新家(线段树,二分答案,离散化)

    [APIO2018] New Home 新家 Solution 对于时间轴我们直接离散化+扫描线,维护每一个商店的加入和删除. 对于询问(x,t)(x,t)(x,t),不好直接回答,这里的关键一步是: ...

  8. L3-002 堆栈 树状数组+二分答案

    题目详情点击这里 思路:用std::stack来表示题目中说的栈,现在关键问题就是如何找到中位数. 可以用二分答案+树状数组的方法 由于每个元素最大不超过1e5,因此开一个大小为1e5的树状数组来存储 ...

  9. maya python 开根号_maya python

    胡泳滨MayaPython简易教程,如需转载,请标明出处地址: http://huyongbin.blogbus.com/c3363976/ 谢谢配合! MayaPython第一篇 - 介绍 大家好, ...

最新文章

  1. qt向服务器传输文字_Qt 模拟 HTTP 表单提交文字或文件到服务器
  2. SpringBoot整合spring-ws开发webservice接口(全流程详细教程)
  3. 导入自己写的类,却被标红,原因及解决方法是?(Pycharm编辑器为例)
  4. 「雕爷学编程」Arduino动手做(24)——水位传感器模块
  5. linux网络代码结构
  6. 《html5 从入门到精通》读书笔记(三)
  7. 《番茄工作法图解》一次只做一件事
  8. 世界500强和中国500强的视觉设计手册,设计圈都传遍了
  9. 1143 -- 函数解析式
  10. HSV对应不同颜色的灰度空间
  11. 秋天来了,穿衣搭配。简单几件穿出独特气质
  12. 利用计算机网线传东西,两个电脑用网线传东西_两台电脑用网线传文件
  13. HTML制作法国国旗
  14. 《编程珠玑》高清pdf版
  15. Python中的If和For函数
  16. Efficient RANSAC for Point-Cloud Shape Detection 点云形状检测的高效RANSAC法
  17. 荣耀9i升级鸿蒙,华为EMUI11将正式开启BETA:首批启动10款机型升级!
  18. C++ 黑科技-文章生成器
  19. PHP实现抓取HTTPS内容
  20. 追溯系统二次开发源代码免费分享---第一篇

热门文章

  1. 元素之和最接近 0 的区间(部分和)
  2. 从二叉树到完全二叉树
  3. C Tricks(十六)—— 复制字符串
  4. 【剑指 offer】(十八)—— 树的子结构
  5. SQOOP——MySQL 和 HDFS 的桥梁
  6. MCMC: Metropolis-Hastings, Gibbs and slice sampling
  7. python excel操作xlwt_关于python操作excel,xlwt,xlwd,最简单的操作介绍
  8. python有趣小程序-第一个有趣的python小程序
  9. python能做什么excel-python能做什么,python自学行吗?
  10. python使用-Python 应该怎么去练习和使用?