试题描述
 给出一个正整数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. Redis 集成Spring(spring-data-redis)

    Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis,  JRedis, and RJC)进行 ...

  2. 基于Ajax的长轮询(long-polling)方式

    如 图 1 所示,AJAX 的出现使得 JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP 请求,JavaScript 响应处理函数根据服务器返回的信息对 HTML 页面 ...

  3. C语言之三目运算符

    三目运算符 三目运算符:也叫三元运算符.这个运算符的符号是: ? : 语法: 表达式1 ? 表达式2 : 表达式3; 语义: 先执行表达式1,执行完毕,表达式1的结果如果为真,那么执行表达式2,并且这 ...

  4. Day1 老男孩python自动化运维课程学习笔记

    2017年1月7日老男孩python自动化运维课程正式开课 第一天学习内容: 上午 1.python语言的基本介绍 python语言是一门解释型的语言,与1989年的圣诞节期间,吉多·范罗苏姆为了在阿 ...

  5. 关于ECSHOP模板架设的服务器php版本过高报错的解决方法(二)

    ECShop安装之后,在后台发现一个错误,这个错误提示的意思:mktime()方法不带参数被调用时,会被抛出一个报错提示. ECShop安装之后,在后台发现一个错误提示: Strict Standar ...

  6. trove命令翻译(上)(只做翻译,未实验效果)

    The trove client is the command-line interface (CLI) for the Database service API and its extensions ...

  7. 想入门webpack,这篇就够了

    申明:本文转载自简书 文/zhangwang(简书作者)原文链接:http://www.jianshu.com/p/42e11515c10f#著作权归作者所有,转载请联系作者获得授权,并标注" ...

  8. php学习笔记——基础知识(2)

    9.PHP语句 if 语句 - 如果指定条件为真,则执行代码 if...else 语句 - 如果条件为 true,则执行代码:如果条件为 false,则执行另一端代码 if...else if.... ...

  9. Linux学习-文件和目录管理 

    Linux文件和目录管理  文件系统架构  1.Linux文件系统具有层级性     1)文件或者目录起始于根目录"/"成为树状结构    2)最顶层由/开始   2 ...

  10. Word 文字转表格

    今天工作的时候遇到一个问题,需要整理出一个工程下依赖的jar的名称和大小,并且按照大小排序,我在使用一个java程序打印出名称和大小之后,需要将这些文字整理到word文档表格中,刚开始是想一个个的拷进 ...