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

相关推荐

ICT调试技巧:从基础到实战的全面指南

本文提供了一份全面的ICT调试技巧指南,涵盖从基础认知到实战应用的全过程。详细解析了ICT设备硬件结构、程序文件构成,并重点讲解了调试界面的核心参数与高效快捷键。通过跳线、电阻、电容及二极管等常见元器件的实战调试案例,分享了参数设置要点与典型问题解决方案,帮助工程师快速掌握ICT调试核心技能,提升测试效率与准确性。

weixin_29202213的博客 342

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

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

2301_76822233的博客 268

FPGA实现电机转速PID控制

通过纯RTL实现电机转速PID控制,包括电机编码器值读取,电机速度、正反转控制,PID算法,卡尔曼滤波,最终实现对电机速度进行控制,使其能够渐近设定的编码器目标值。

STATEABC的博客 7503

Java BigDecimal开方

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

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

层层剥开Allegro skill--快速抓取并写入Allegro软件【呕血创作,转载注明】

Allegro skill eda pcb

qq_36492361的博客 1253

Unity线性空间下PSD透明贴图黑边问题:原理分析与三种解决方案

在计算机图形学中,颜色空间转换与Alpha混合是渲染管线的基础环节。伽马空间与线性空间的差异源于显示设备与人眼感知的特性,现代渲染引擎采用线性工作流以实现更真实的光照计算。然而,当图像处理软件(如Photoshop)导出的纹理数据与游戏引擎(如Unity)的预期格式不匹配时,就会引发技术问题,影响视觉保真度与开发效率。具体表现为,在线性空间下进行Alpha Blend混合时,带透明通道的纹理边缘常出现异常黑边或颜色失真,其核心根源在于纹理数据是否经过“预乘”处理与sRGB标记的解读冲突。这一问题的解决对于提

weixin_34198762的博客 380

大数开方

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

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

4-都2026年了,嵌入式发展前景怎么样,还适合入行吗?

本文系统分析了嵌入式行业的发展前景,指出到2026年嵌入式将迎来由"万物智联"驱动的黄金周期。文章回顾了嵌入式技术的四个演进阶段,从专用计算机到AIoT时代,强调其技术积累的延续性。作者从人才流向、产业智能化转型、高校新增专业等角度论证嵌入式行业的蓬勃发展,并提出"铁三角"模型分析其驱动力和护城河。最后给出职业发展路径建议,认为嵌入式适合长期主义者,在智能汽车、边缘计算等领域有广阔前景。文章建议读者抓住产业升级机遇,选择这一稳定且有复利效应的技术赛道。

指尖动听知识库 389

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

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

rwzhang的博客 9359

vivo X200 Ultra前瞻系列(1):重塑影像旗舰标准

在色彩风格化、视频专业度上实现了安卓阵营的突破性进步。其2亿像素长焦、双LYT-818传感器及5轴防抖技术,对追求个性化创作的用户具有强吸引力。若真机表现能兑现硬件承诺,X200 Ultra有望重新定义手机影像的“专业”标准。然而,其厚重设计、价格门槛及生态适配问题,仍需市场检验。vivo X200 Ultra作为2025年上半年影像旗舰,以“全焦段夜视仪+电影级视频”为核心卖点,主打。,对标小米15 Ultra、OPPO Find X8 Ultra等竞品。,顶配版(24GB+2TB)逼近万元。

专注:太空算力、AI infra、异构调度、大模型成本工程 964

第4章--CANoe library开发 - 诊断功能

因为专栏要做的是汽车ECU自动化测试程序,测试的是ECU的诊断和刷新,因此就需要利用CANoe的接口,开发一些方便使用的诊断报文收发函数。

j187067046的博客 1398

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

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

m0_73493077的博客 1523

励磁电感 Lm 选对了,LLC 才真“高效”:半桥 LLC 效率优化

你有没有遇到过这种 LLC:参数一套下来,ZVS 也有了,波形看着也“挺谐振”,但一上功率——,效率就是死活上不去。我说句直白的:LLC 的“高效”,很大一部分其实是在背后控场。Lm 选小了,励磁电流蹭蹭涨,谐振电流 RMS 变大,导通损耗、开关损耗、整流损耗一起上天;Lm 选太大,又可能把 ZVS 的门槛抬高,轻载掉 ZVS,EMI 也开始作妖。

weixin_43199439的博客 436

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

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

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

sgu111 (大整数开方)

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

Durandal的专栏 594

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SGU111 Very simple problem

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

╮(╯▽╰)╭ 471

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

余额充值