JAVA BigInteger 类用例 1:求一个大整数的平方根的整数部分 (SGU 111)

BigDecimal开n次方根 复杂的BigDecimal计算,需要开方的式子,可输入结果精确位数 立即下载

111. Very simple problem

Time Limit: 0.25 sec, Memory Limit: 1 MB

You are given natural number X. Find such maximum integer number that it square
is not greater than X.

Input

Input file contains number X (1 ≤ X ≤ 10^1000).

Output

Write answer in output file.

Sample Input

16

Sample Output

4

题意很简单,就是求一个可能多达1000位的正整数 X 的平方根的整数部分。

初学 JAVA ,用 JAVA 的 BigInteger 类来实现牛顿迭代求平方根 (很多库函数不知道,靠自己来写咯)。

import  java.math. * ;
import  java.io. * ;

public   class  Solution  {
    
// 将字符串转为正整数
    static int str2int (String str)    // 0 <= the integer <= 2 ^ 31 -1
    {
        
int ret = 0;
        
for (int i = 0, j = str.length (); i < j; i ++)
        
{
            ret 
= ret * 10 + str.charAt(i) - '0';
        }

        
return ret;
    }

    
// 将正整数转为字符串
    static String int2str (int i)    // 0 <= i <= 2 ^ 31 -1
    {
        StringBuffer sb 
= new StringBuffer ("0000000000");
        
int digit = 0;
        
if (i == 0)
        
{
            
return "0";
        }

        
while (i > 0)
        
{
            digit 
++;
            
int low = i % 10;
            i 
/= 10;
            sb.setCharAt (
10 - digit, (char)(sb.charAt(10 - digit) + low));
        }

        
return sb.substring(10 - digit);
    }

    
// 求正整数的平方根的整数部分 (这个是抄自 Hacker's Delight 一书的)
    static int isqrt (int x)    // 0 <= x <= 2 ^ 31 -1
    {
        
int b, m = 0x40000000, y = 0;
        
while (m != 0)
        
{
            b 
= y | m;
            y 
>>= 1;
            
if (x >=b)
            
{
                x 
-= b;
                y 
|= m;
            }

            m 
>>= 2;
        }

        
return y;
    }

    
    
public static void main (String[] args) throws IOException
    
{
        BufferedReader br 
= new BufferedReader(
                
new InputStreamReader(System.in)
                );
        String str 
= br.readLine ();
        BigInteger bi [] 
= new BigInteger [3];
        bi [
0] = new BigInteger (str);    // bi [0] 保存需要求平方根的数 X
        int len = str.length ();
        
// 如果 X 小于 1000000000,那么直接求平方根的整数部分
        if (len < 10)
        
{
            System.out.println (isqrt (str2int (str)));
            
return;
        }

        
// 如果 X 的位数是奇数,high 等于 X 的最高位,否则等于最高两位
        int high = str.charAt(0) - '0';
        
if (len % 2 == 0)
        
{
            high 
= high * 10 + str.charAt(1) - '0';
        }

        
// 将 high 的平方根的整数部分加上 1 之后乘以 10^((len - 1) / 2)
        
// 乘积不小于 X 的平方根的整数部分,保存到 char [] ch 中
        
// 然后赋值到 bi [1]
        int r = isqrt (high) + 1;
        
int zeros = (len - 1) >> 1;
        str 
= int2str (r);
        r 
= str.length ();
        
char ch [] = new char [r + zeros];
        
for (int i = 0; i < r; i ++)
        
{
            ch [i] 
= str.charAt (i);
        }

        
for (int i = r; i < ch.length; i ++)
        
{
            ch [i] 
= '0';
        }

        bi [
1] = new BigInteger (new String (ch));
        
// 牛顿迭代过程: X_k+1 = (X_k ^ 2 + X) / (X_k * 2)
        
// 通过 i = 3 - i ,可使 bi [1] 和 bi [2] 轮流保存 X_k, X_k+1
        
// 当 X_k+1 >= X_k 时, X_k 即为 X 的平方根的整数部分
        int i = 1;
        
do
        
{
            bi [
3 - i] = bi [i].pow(2).add (bi [0]).divide (bi [i].shiftLeft (1));
            i 
= 3 - i;
        }
 while (bi [i].compareTo (bi [3 - i]) == -1);
        System.out.println (bi [
3 - i]);
    }

}


在 SGU 提交的结果:
ID:     Date'n'Time:     Name:     Task:     .Ext:     Status:     Time:     Memory:
652002    28.10.07 02:20    rappizit    111     .JAVA    Accepted    126 ms    0 kb
BigDeclimal对大数据开根号Util 立即下载

相关推荐

AUTOSAR SHE 密钥更新协议

依赖内存槽的使用用例,内存槽有不同的保护协议。M2是新的计数值C_ID‘,相应的标志位F_ID',0填充第一个块,以及新的密钥K_ID'的组合的CBC算法加密的消息。例如,我要更新一个MASTER_ECU_KEY, 那么参考上表,我需要知晓Non-volatile的MASTER_ECU_KEY (即授权密文为MASTER_ECU_KEY自己的密文).内存的更新协议分为两部分,第一部分是实际内存更新到发送一个秘密且真实的key到SHE,然后第二部分为验证,即提供给后台一个key更新成功的证据。

weixin_46481662的博客 3279

求给定数的平方根整数部分java实现

​ 键盘录入一个大于等于2的整数 x ,计算并返回 x 的 平方根。结果只保留整数部分 ,小数部分将被舍去。

2301_76822233的博客 268

Mac 安装neo4j(解压版)最新版本教程

本文介绍了在Mac M系列操作系统上安装Neo4j图数据库的具体步骤。内容包括:从官网下载解压版Neo4j社区版压缩包;通过终端命令将其解压到/opt目录并重命名;配置环境变量以便全局访问;以及常用命令如启动/停止服务、重置密码等。安装完成后,用户可通过浏览器访问http://localhost:7474,使用默认账号neo4j/neo4j登录并根据提示重置密码。该教程简洁明了地指导用户完成Neo4j在Mac上的安装配置过程。

猿小白的博客 909

Java BigDecimal开方

一般开平方使用的是Math中的静态方法`Math.sqrt(double a)`,涉及到金融计算的时候,`Math.sqrt(double a)`精度就不够了。金融领域的计算,用的都是BigDecimal类型。然而BigDecimal对于数字开平方没提供有效的方法。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2万+

使用Simulink进行四足机器人的非线性动力学建模与仿真

四足机器人的运动包含多个自由度(DOF),包括腿部的摆动和支撑阶段的动力学特性。由于存在接触力、摩擦以及不同地形的影响,四足机器人的动力学行为呈现出高度的非线性特征。因此,构建准确的非线性动力学模型对于研究机器人的运动学和动力学特性至关重要。定义代表机器人状态的变量,如位置、速度、角度和角速度。matlab深色版本通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的非线性动力学模型,并进行了详细分析。

xiaoheshang_123的博客 311

ArcGIS笔记2_如何将经纬度WGS84地理坐标系转换为米单位CGCS2000投影坐标系

本博文则主要讲解,如果我们手里拿到的shp文件是在ArcGIS中,如何将经纬度WGS84地理坐标系转换为米单位CGCS2000投影坐标系。

晏长街的博客 4万+

大数开方

转自:http://blog.youkuaiyun.com/hondely/article/details/6939895

要去相信,没有到不了的明天 3120

C#与欧姆龙PLC 通信——fins udp协议

该调试助手专门为了帮助大家学习以及测试Fins-Udp通信,下面进行详细介绍。

qq_34059233的博客 2874

JAVA BigDecimal使用牛顿迭代法计算平方根(开方)

Java中虽然可以用Math.sqrt获得某值的平方根,但是该值必须是double类型的。可是有些项目对数值精度要求比较高,我们一般会用BigDecimal来存储,BigDecimal并不提供计算平方根的方法,于是我们只能自己动手丰衣足食了!下面介绍使用牛顿迭代法计算某值的平方根。 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson met...

rwzhang的博客 9359

使用静态库在嵌入式系统中进行开发

静态库是一种包含预编译对象代码的文件,它可以与应用程序链接在一起,并在编译时将库的代码复制到最终的可执行文件中。静态库是包含预编译对象代码的文件,可以与应用程序链接在一起,并在编译时将库的代码复制到最终的可执行文件中。需要注意的是,由于嵌入式系统的资源限制,开发人员应该仔细选择需要包含在静态库中的功能,并避免引入不必要的依赖关系。需要注意的是,由于嵌入式系统的资源限制,开发人员应该仔细选择需要包含在静态库中的功能,并避免引入不必要的依赖关系。的静态库文件,可以在嵌入式系统的应用程序中使用它了。

ZrElixir的博客 203

【实战】LLaMA-Factory 如何做 LLM 的多轮对话微调

LLaMA-Factory 作为一个广受欢迎、易于使用的 LLM 微调框架,为开发者提供了便捷的途径来针对特定任务(包括多轮对话)优化模型。本文将深入探讨 LLaMA-Factory 如何支持多轮对话微调,涵盖其基本概念、数据准备、核心机制、评估方法等。简单来说,多轮对话是指包含两个或更多轮次(Turn)的交互过程,其中每一轮通常包含用户的一个输入和模型的一个输出。后续轮次的回应通常依赖于前面轮次的对话内容。模型需要理解并记忆对话历史。

kakaZhui的博客 1309

BigDicemal加减乘除、保留小数、平方开方、比较大小

BigDicemal加减乘除、保留小数、平方开方、比较大小

m0_73493077的博客 1522

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

sgu111-112大数运算

111原题链接http://acm.sgu.ru/problem.php?contest=0&problem=111 112原题链接http://acm.sgu.ru/problem.php?contest=0&problem=112 这里我超级偷懒,用了 JAVA的大数类~~~ sgu111,二分查找 import java.io.*; import java.math.

abcd1992719g的专栏 1512

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

sgu111 (大整数开方)

大整数开方。。。偷懒,抄了个java。。。留一下。。。回头弄一下java的dashuzi

Durandal的专栏 594

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SGU111 Very simple problem

输入一个大整数X,输出平方小于等于X的最大的整数

╮(╯▽╰)╭ 471

sgu 111. Very simple problem 大数开方

111. Very simple problemtime limit per test: 0.25 sec. memory limit per test: 4096 KBYou are given natural number X. Find such maximum integer number that it square is not greater than X.InputInput fi...

superkunn的博客 304

SGU 111 Very simple problem

SGU_111 又一次写大数开平方了,由于Java写起来比较方便,所以就直接用Java写了。 import java.math.BigInteger;import java.util.Scanner;public class Solution { public static void main(String[] args) { Scanner cin = new...

weixin_30273763的博客 73

SGU118 Digital Root

令V=A1∗A2∗…∗AN + A1∗A2∗…∗AN−1 + … + A1∗A2 + A1 每次将V变为V的数位和,直至V小于10,输出这时V的值

╮(╯▽╰)╭ 656

sgu 111 Very simple problem 高精开平方

给一个不超过10^1000的数n,求最大的数k使得k^2 import java.io.*; import java.util.*; import java.math.*; public class aaa { public static void main(String[] args) { Scanner cin= new Scanner(new BufferedInputSt

Broken Wings 836

SGU112 a^b - b^a

输入a和b,输出a^b - b^a的值

╮(╯▽╰)╭ 493

SGU 292 Field for the Cemetery

题目链接:http://acm.sgu.ru/problem.php?contest=0&amp;problem=292 题意:Q*C的格子里放1*n的长方形,最多放几个? 思路:一种是横着放然后竖着放,还有一种如下: import java.util.*; import java.io.*; import java.math.*; public class Solutio...

weixin_34185560的博客 142

SGU 342 Reihenfolge(进制)

题目链接:http://acm.sgu.ru/problem.php?contest=0&amp;problem=342 题意:A=s1Bk1+s2Bk2+...+snBkn,si=-1或者si=1。给出A和B使得n最小? 思路:比如B=10,那么40=10+10+10+10=100-10-10-10-10-10-10,即两种方法表示。 import java.io.*; import...

weixin_34259559的博客 101

SGU 112 a^b - b^a

SGU_112     用Java的BigInteger很容易实现。 import java.math.BigInteger;import java.util.Scanner;public class Solution { public static void main(String[] args) { Scanner cin = new Scanner(System....

weixin_34199335的博客 123
上一篇: 判断线段相交
下一篇: 单源最短路 Dijkstra 算法 C++高效实现
Rappy
博客等级 码龄20年 48粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值