试题描述
 给出一个正整数n,求n开根号后的整数部分的值。n的位数不超过1000位。
输入
读入一个不超过1000位的正整数n。
输出
输出所求答案
输入示例
17  
输出示例
4

高精度开根:需要用的是手算开平方根的方法,我其实这个方法也不会,是临时到网上学习的

网上说的方法都挺详细的,我在这里就不详细说了,下面直接贴代码:

高精度模板需要用到高减高,高乘低,高加低。

 #include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
typedef long long LL;
inline int read()
{
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=x*+c-'';c=getchar();}
return x*f;
}
const int maxn=;
struct data
{
int l,v[maxn];
data(){l=;memset(v,,sizeof(v));}
data operator = (const data& s)
{
l=s.l;memset(v,,sizeof(v));
for(int i=;i<=l;i++)v[i]=s.v[i];
return *this;
}
data operator = (const int& s)
{
l=;v[]=s;
while(v[l]>)v[l+]+=v[l]/,v[l]%=,l++;
return *this;
}
data operator - (const data& s)
{
data c;c.l=l;
for(int i=;i<=c.l;i++)c.v[i]=v[i];
for(int i=;i<=c.l;i++)c.v[i]-=s.v[i];
for(int i=;i<c.l;i++)if(c.v[i]<)c.v[i]+=,c.v[i+]--;
while(!c.v[c.l])c.l--;
return c;
}
data operator * (const int& s)
{
data c;c.l=l;
for(int i=;i<=c.l;i++)c.v[i]=v[i]*s;
for(int i=;i<c.l;i++)if(c.v[i]>)c.v[i+]+=(c.v[i])/,c.v[i]%=;
while(c.v[c.l]>)c.v[c.l+]+=(c.v[c.l])/,c.v[c.l]%=,c.l++;
return c;
}
data operator + (const int& s)
{
data c=*this;
c.v[]+=s;int i=;
while(c.v[i]>)c.v[i+]+=c.v[i]/,c.v[i]%=,i++;
c.l=max(c.l,i);
return c;
}
bool operator <= (const data& t)const
{
if(l!=t.l)return l<t.l;
for(int i=l;i;i--)if(v[i]!=t.v[i])return v[i]<t.v[i];
return ;
}
}a;
int num[];
void scan(data &s)
{
char ch[maxn];
scanf("%s",ch+);s.l=strlen(ch+);
for(int i=;i<=s.l;i++)s.v[i]=ch[s.l-i+]-'';
return;
}
void print(data s){for(int i=s.l;i;i--)printf("%d",s.v[i]);cout<<endl;}
void init(data s)//将这个数从个位起,向左每两位分一节(例如65536变成6,55,36)
{
if(s.l%)
{
num[]=s.v[s.l];
for(int i=;i<=s.l;i+=)num[i/]=s.v[s.l-i+]*+s.v[s.l-i];
}
else for(int i=;i<=s.l;i+=)num[i/]=s.v[s.l-i+]*+s.v[s.l-i];
return;
}
data Sqrt(data s)
{
data ans,t,q,p;
ans=;t=;
int len= s.l% ? s.l/+ : s.l/;//划分块的数量
for(int i=;i<len;i++)
{
t=(t*)+num[i];
p=ans*;ans=ans*;//这里的ans要提前乘以10,如果下面的循环一次都没进去的话,ans就不会更新了
for(int j=;j>=;j--)
{
q=(p+j)*j;
if(q<=t)
{
ans=ans+j;
t=t-q;
break;
}
}
}
return ans;
}
int main()
{
scan(a);
init(a);
print(Sqrt(a));
return ;
}

[code3119]高精度练习之大整数开根的更多相关文章

  1. codevs 3119 高精度练习之大整数开根 (各种高精+压位)

    /* codevs 3119 高精度练习之大整数开根 (各种高精+压位) 二分答案 然后高精判重 打了一个多小时..... 最后还超时了...压位就好了 测试点#1.in 结果:AC 内存使用量: 2 ...

  2. 大整数类BIGN的设计与实现 C++高精度模板

    首先感谢刘汝佳所著的<算法竞赛入门经典>. 众所周知,C++中储存能力最大的unsigned long long 也是有着一个上限,如果我们想计算非常大的整数时,就不知所措了,所以,我写了 ...

  3. Ural 1158. Censored! 有限状态自动机+DP+大整数

    Ural1158 看上去很困难的一道题. 原文地址 http://blog.csdn.net/prolightsfxjh/article/details/54729646 题意:给出n个不同的字符,用 ...

  4. COJ 1211 大整数开平方

    手写求大整数开根号所得到的值,具体计算过程参考别人的资料,最后利用java的大整数得到答案 别人博客链接:http://www.cnblogs.com/Rinyo/archive/2012/12/16 ...

  5. BZOJ 高精度开根 JAVA代码

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

  6. Java高精度基础+开根

    在焦作站的acm网络赛中遇到了一个高精度开根的水题--但是那时候WA了 后面学写java补题还T了orz 所以写一篇文章来记录一下java的大整数类型的基础和开根还有一点心得体会吧 首先给那一题的题面 ...

  7. 【BZOJ1213】高精度开根

    python是坠吼的! 原题: 不贴原题,就是高精度开根,结果向下取整 首先二分答案,高精度嘛……python即可 二分右端点设为n会T掉,需要先倍增一个r,while(r **m <= n) ...

  8. BZOJ 1213: [HNOI2004]高精度开根

    二次联通门 : BZOJ 1213: [HNOI2004]高精度开根 正解 NTT+高精+倍增+二分 但是可以用python 2333333 m,n=int(raw_input()),int(raw_ ...

  9. POJ 1001 解题报告 高精度大整数乘法模版

    题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...

随机推荐

  1. Kafka分布式集群搭建

    环境说明 kafka自0.9之后增加了connector的特性.本文主要是搭建一个分布式的kafka connector和broker. 本文用了三台机器进行部署,使用centos 6.6. host ...

  2. 用indexOf获取字符窜某个字符的所有位置

    indexOf方法可以传两个参数,第二个参数是传位置的参数,利用这点获取所有的位置.例如: var str = "hello world,welcome!"; var arr = ...

  3. 用C++实现的八皇后问题

    我是一个C++初学者,控制台实现了一个八皇后问题. 代码如下: //"八皇后问题"V1.0 //李国良于2017年1月11日编写完成 #include <iostream&g ...

  4. 在Openstack上创建并访问Kubernetes集群

    第一部分:创建集群 在Openstack部署Kubernetes集群运行Nginx容器的步骤,其中包括: 利用Murano部署Kubernetes集群 配置Openstack的安全性使Kubernet ...

  5. maven自定义骨架

    Maven 的 archetype 技术,为新建标准化的工程框架提供了方便.为自定义一套工程框架标准,可参考以下步骤操作: 1,创建一个项目的原型 2,在项目根目录执行命令:mvn archetype ...

  6. Docker集群实验环境布署--swarm【1 架构说明】

    在读完<Docker技术入门与实践>这本书后,基本上已对Docker了有一些入门的理解,以及我们为什么要使用Docker 答:我们发现在实际工作中,通过openstack一旦把一个VM创建 ...

  7. gulp备忘

    // npm install gulp gulp-sourcemaps gulp-name gulp-notify del --save-dev // npm install gulp-ruby-sa ...

  8. [Usaco 再次除草]

    以后都用自己的号交吧 免得掉人品 Noip2016就是一个见证 一步一个脚印的刷 noip没把前两题稳拿就刷牛头..   bzoj1230 线段树打翻转标记,练手感 bzoj1231 状态压缩 预处理 ...

  9. Scheme-CPS

    给出斐波那契数列计算函数,普通版和CPS版 #lang SCHEME (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2)))) ...

  10. springMVC实现文件上传下载

    上传文件和下载文件是个常用的技能,在哪里开发几乎都能遇见,而所有的上传控件各不相同,插件很多,后台也有很多,这里我只尝试过这个方法觉的还够简洁.具体如下实现: 1.spring-mvc.xml配置   ...