对大数(BigInteger)进行开方运算
来源:互联网 发布:怎么查看服务端口 编辑:程序博客网 时间:2024/05/21 17:32
在 BigInteger 中没有对 getSqrt(BigInteger num) 方法,在对大数进行开方处理的时候比较麻烦,前几天在做蓝桥杯训练的时候看到了这个算法,时间复杂度较低,感觉挺好的,分享一下,^_^ ……
import java.math.BigInteger;import java.util.Arrays;/** * Created by MGL on 2017/4/21. */public class BigInteger_Sqrt{ public static void main(String[] args) { String str = "846516548651346132456465132189465134894651645613"; BigInteger n1 = new BigInteger(str); BigInteger multiply = n1.multiply(n1); int length = multiply.toString().length(); System.out.println("数的长度 = " + length); long start = System.nanoTime(); BigInteger sqrt = getSqrt(multiply); long end = System.nanoTime(); System.out.println(end - start); System.out.println("对" +length +"位数进行开放运算所需要的时间 = " + (end - start)/1000000000F + "s"); System.out.println("运算结果 = " + (sqrt.compareTo(n1) == 0)); } private static BigInteger getSqrt(BigInteger num) { String s = num.toString(); int mlen = s.length(); //被开方数的长度 int len; //开方后的长度 BigInteger beSqrtNum = new BigInteger(s);//被开方数 BigInteger sqrtOfNum; //存储开方后的数 BigInteger sqrtOfNumMul; //开方数的平方 String sString;//存储sArray转化后的字符串 if (mlen % 2 == 0) len = mlen / 2; else len = mlen / 2 + 1; char[] sArray = new char[len]; Arrays.fill(sArray, '0');//开方数初始化为0 for (int pos = 0; pos < len; pos++) { //从最高开始遍历数组, //每一位都转化为开方数平方后刚好不大于被开方数的程度 for (char ch = '1'; ch <= '9'; ch++) { sArray[pos] = ch; sString = String.valueOf(sArray); sqrtOfNum = new BigInteger(sString); sqrtOfNumMul = sqrtOfNum.multiply(sqrtOfNum); if (sqrtOfNumMul.compareTo(beSqrtNum) == 1) { sArray[pos] -= 1; break; } } } return new BigInteger(String.valueOf(sArray)); }}
该算法的最坏情况是将循环中所有的数字都遍历完,为 len * 9,因此时间复杂度为 O(n)。
帅照:
0 0
- 对大数(BigInteger)进行开方运算
- BigInteger类(大数运算)
- java中进行高精度、大数运算总结BigInteger BigDecimal
- BigInteger开方
- C# 4.0 大数的运算,BigInteger
- 大数开方
- 大数开方
- 大数开方
- 大数开方,大数相乘
- SGU111 Very simple problem(大数开方)
- nyist 773 开方数(大数问题)
- POJ2109 高精度(含大数开方)+二分
- 大数BigInteger精确数Decimal的运算操作
- java中大数运算Biginteger类的方法调用
- 蓝桥杯PREV-34(数论+大数相乘大数开方模板)
- 【原】biginteger。大数乘法。大数运算。“无限大数字”乘法。大数乘法两种方法对比
- Java 大数高精度函数(BigInteger)
- 大数 开方 GMP mpz_sqrt
- Problem F: 二进制类(1)__运算符重载 hzauoj
- 设计一个只能在堆上或栈上的类
- uva12545比特变换器
- Visual Studio 2010 使用
- 编译安装PHP,解决问题 Don't know how to define struct flock on this system, set --enable-opcache=no
- 对大数(BigInteger)进行开方运算
- C#之Switch分支语句
- 20153724——2
- 【LeetCode】Student Attendance Record I 解题报告
- 2016东莞市特长生考试 字串距离
- python中的类属性和实例属性
- [51Nod 1048] 整数分解为2的幂 V2
- 神奇的ActivityLifecycleCallbacks,解决Activity管理的后顾之忧
- ListView多条目加载