试题描述
 给出一个正整数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. Android开发(22)--seekBar采用handler消息处理操作

    本案例简单实现进度条可走,可拖拽的功能,下面请看源码: 布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/ ...

  2. C#中的文件操作2

    1. 读取文件的方法: 1.  声明一个文件流: 目的是为了内存与文件之间的桥梁,可以进行数据的往来. FileStream fs = new FileStream(filename,FileMode ...

  3. 在VisualStudio中显示当前的分支名

    当项目多的时候,当分支多的时候,当会议多的时候. 你打开VS,你是否犹豫过,"我现在是打开的哪个分支?!!!!??!" 如果你米有犹豫过,是否有过,"FXXXXK, 我怎 ...

  4. Xpath学习笔记

    最近复习自己上一年的课本,想起来刚学那个时候想做一个写日记的软件. 想不如做,用控制台瞎写了一个,一做就成了,没什么bug,期间使用Xpath来读数据,所以就稍微学了一下. 学习过程就这样做一点笔记, ...

  5. iOS 10 之后,相机权限问题及易出现的Crash

    1: iOS 10 之后,访问相机需要设置相关的权限 麦克风权限:Privacy - Microphone Usage Description 是否允许此App使用你的麦克风? 相机权限: Priva ...

  6. Android Tips

    (1).设置图片缓存大小,一般可以设置为内存的1/8 int memoryCache = (int) (Runtime.getRuntime().maxMemory() / 8); (2). (3). ...

  7. SQL总结之创建实例表空间监听

    [创建数据库实例]cmd------>dbca[创建表空间-sql创建]create tablespace NSTC_WS logging datafile 'D:\app\dell\orada ...

  8. 手动为maven的本地仓库添加JAR

    在要添加的jar所在的文件夹下打开黑屏 如添加Oracle的ojdbc6.jar 输入: mvn install:install-file -DgroupId=com.oracle -Dartifac ...

  9. 【IE6的疯狂之八】链接伪类(:hover)CSS背景图片有闪动BUG

    IE6下链接伪类(:hover)CSS背景图片有闪动BUG,主要原因ie会再一次请求这张图片,或者说图片没被缓存. 例如: CSS代码 a:hover{background:url(imagepath ...

  10. hdu1033

    #include<stdio.h> #include<string.h> const int MAXN=200; char str[MAXN]; int main() { in ...