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 立即下载

相关推荐

MuJoCo柔性体仿真实战:从FlexComp建模到自定义模型导入

柔性体仿真是机器人交互研究中不可或缺的一环,MuJoCo作为高精度物理求解器,凭借高效的求解速度与批量并行能力,成为强化学习与软体抓取任务的热门选择。其FlexComp机制将连续材料离散为粒子-约束系统,以较低建模成本模拟布料、软组织等形变行为,相比Gazebo等平台更具实时性与可扩展性。技术价值体现在自定义柔性体建模与导入流程中:通过XML配置网格密度、间距与材料参数,即可生成贴合任务需求的软体垫子或硅胶抓手。在柔性抓取、颗粒抓手、医疗仿真等场景中,该方法能快速构建可训练的环境。围绕环境搭建、FlexCo

weixin_29045585的博客 160

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

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

2301_76822233的博客 268

全网首发!Yolov8_obb旋转框训练、测试、推理手把手教学(DOTA1.0数据集map50已达80%)

其中,images/train和images/val放置原始图片文件,labels/train_original和labels/val_original分别放置原始的标签文件,labels/train和labels/val为空,然后运行步骤(3)的代码,运行结束转换后的标签会保存在labels/train和labels/val中,格式如下。(4)新建yolov8-obb.yaml,修改nc和scales,我使用的是yolov8n.(2)构建数据集,安装下面目录格式,其他test可为空,一定要对应。

小嘤熊的博客 2万+

Java BigDecimal开方

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

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

深入解析STM32驱动AT25DF321A FLASH芯片的SPI通信与数据完整性验证

本文深入解析STM32通过SPI通信驱动AT25DF321A FLASH芯片的全过程,包括硬件连接、驱动函数实现与数据完整性验证。重点介绍SPI配置、读写操作优化及CRC校验方法,确保数据存储的可靠性,为嵌入式存储系统开发提供实用指南。

agile9scrum的博客 1064

手把手教你用RC桥式振荡器生成1Hz-1MHz正弦波(附完整电路图)

本文详细介绍了如何从零构建RC桥式振荡器,实现1Hz-1MHz正弦波的生成。通过核心元件选型、参数设计、电路搭建与优化等步骤,帮助读者掌握振荡器的工作原理和实战技巧。特别适合电子实验和信号处理领域的初学者和工程师,附完整电路图和常见问题解决方案。

weixin_30338481的博客 467

大数开方

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

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

博途PLC PID仿真LSim_PT1库算法(一阶系统差分方程推导全过程)

博途PLC的PID仿真可以参看下面这篇博客,这篇文章我们主要论坛仿真库LSim的算法由来。如何利用博途PLC PID_Compact 进行PID仿真(一阶系统)_RXXW_Dor的博客-优快云博客博途PLC PID控制器 PID_Compact FB如何使用可以参看下面这篇文章,这里不再赘述。

RXXW_Dor的博客 2858

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

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

rwzhang的博客 9359

Arduino IDE 开发ESP32-S3编译报错 Sketch too big?一步步解决!

解决方法很简单,只需要一步步来修改 Arduino IDE 的配置即可。确保你已经打开 Arduino IDE 并加载了你的 ESP32 代码。如果你也遇到了这个问题,按这个方法试试,应该就能顺利搞定!,如果你需要 OTA,就不能选这个方案,需要换成。,但我回头一想,我这块 ESP32-S3 可是。,按理说存储空间应该足够啊,那这到底是咋回事?,默认方案就装不下了,这时就需要选择更大的。按钮,这次应该不会报错了!,然后在下拉菜单中找到。,可以支持更大的固件。如果你的固件体积超过。,就能正常编译上传。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2136

NSIS教程(8): 基于第三方界面库的安装包界面

前面的几篇文章介绍了NSIS的传统界面的安装包和现代界面的安装包的制作方法,也提到了NSIS支持自定义页面(即使用page custom)的特性,自定义页面需要用户自己创建对话框、控件、添加控件响应等等,虽然NSIS提供了nsDialogs.nsh来支持这些功能,但使用起来还是不太方便(需要专门了解这个插件诸多用法),而且不够灵活,所以本文介绍一种终极的自定义界面的安装包解决方案,即完全使用第三方

while(1) { smile(); } 9万+

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

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

m0_73493077的博客 1523

C#上位机实战:Modbus RTU串口通信(CRC校验+超时重发完整实现)

在工业自动化上位机开发中,Modbus RTU是串口通信的事实标准协议,SerialPort是 .NET 平台操作串口的原生类,无需依赖第三方库即可实现基础通信。实际项目中,工控现场存在电磁干扰、串口丢包、设备响应延迟等问题,CRC 数据校验用于保证报文完整性,超时重发机制用于提升通信稳定性。本文从零封装一套可直接落地的 Modbus RTU 通信组件,包含完整的校验算法、超时控制、重发逻辑,并配套 WinForm 演示界面。本文基于 C# 原生SerialPort类,实现了一套生产可用。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 389

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

sgu111 (大整数开方)

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

Durandal的专栏 594

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SGU111 Very simple problem

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

╮(╯▽╰)╭ 471

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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、付费专栏及课程。

余额充值