zoukankan      html  css  js  c++  java
  • JAVA高精度_求高精度幂


    首先是题目传送门: NYoj 155 求高精度幂 

    要想用Java轻快的水过这道题,要先了解下JAVA.math中的几个方法


    1.Java.math.BigDecimal.toPlainString() 返回此BigDecimal的字符串表示形式不带指数字段。

    例如来个小对比:函数 toPlainString() 和 toString()

    对于  BigDecimal b ;     (b=(0.4321)^ 20)
    String s = b.toPlainString() ;
    System.out.println(s) ;
    输出为:
    0.00000005148554641076956121994511276767154838481760200726351203835429763013462401

    若String s = b.toString() ;
    输出为:
    5.148554641076956121994511276767154838481760200726351203835429763013462401E-8

    给一个字符串1.238761976E-10
    如何得到0.0000000001238761976这个字符串呢?

    BigDecimal bd = new BigDecimal("1.238761976E-10");  
    System.out.println(bd.toPlainString());


    2.java.math.BigDecimal.stripTrailingZeros() 返回一个BigDecimal,它在数值上等于这一个,但表示形式移除所有尾部零。

    用一个例子来说明:

    有一个特殊情况,就是整数为0的时候:

    BigDecimal num=new BigDecimal("0.00").stripTrailingZeros();
    System.out.println(num);
    输出为0.00 

    这里面有个组件精度的转换,具体也没搞清楚,后面学Java课程的时候回来继续补充

    别人提出的问题:http://bbs.csdn.net/topics/350081635

    相关的对此函数方法的解释:http://www.yiibai.com/java/math/bigdecimal_striptrailingzeros.html 


    3.startsWith()方法:

    1. if(a.startsWith(b))   
    2. //判断字符串a 是不是以字符串b开头.
     
    1. if(a.endsWith(b))   
    2. //判断字符串a 是不是以字符串b结尾.
    startsWith方法测试此字符串从指定索引开始的子字符串是否以指定前缀开始


    语法1 public boolean startsWith(String prefix) 

    返回值:如果参数表示的字符序列是此字符串表示的字符序列的前缀,则返回true;否则返回false。如果参数是空字符串,或者等于此String对象(用equals(Object)方法确定),则返回true。

    参数:prefix为指定的前缀。

    示例  本示例使用startsWith方法来判断字符串str是否以字符串“like”开始,并将结果赋值给boolean变量b。由于字符串str不是以字符串“like”开始的,因此boolean类型变量b的值为false。

    String str = "I like Java";    //定义一个字符串
    
    boolean b = str.startsWith("like");
    
    System.out.println(b)


    语法2 public boolean startsWith(String prefix , int toffset) 

    返回值:如果参数表示的字符序列是此对象从索引toffset处开始的子字符串,则返回true;否则返回false。如果toffset为负或大于此String对象的长度,则结果为false;否则结果与该表达式的结果相同。

    参数:prefix为指定的前缀。

    参数:toffset为在字符串中开始查找的位置。

    示例  本示例使用startsWith方法来判断前缀“I l”是否是字符串strCom1中开始索引位置是0的字符序列,并将结果赋值给boolean变量strB。由于字符串strCom1中开始索引位置在0的字符序列与指定的前缀“I l”相同,因此对象strB为true。

    String strCom1 = "I like Java";   //定义一个字符串
    
    boolean strB = strCom1.startsWith("I l",0);
    
    System.out.println(strB);


    4.String中的subString()方法:

    str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str;

    str=str.substring(int beginIndex,int endIndex);截取str中从beginIndex开始至endIndex结束时的字符串,并将其赋值给str;


    public String substring(int beginIndex, int endIndex)
    第一个int为开始的索引,对应String数字中的开始位置,
    第二个是截止的索引位置,对应String中的结束位置
    1、取得的字符串长度为:endIndex - beginIndex;
    2、从beginIndex开始取,到endIndex结束,从0开始数,其中不包括endIndex位置的字符
    如:
    "hamburger".substring(4, 8) returns "urge"
     "smiles".substring(1, 5) returns "mile"
    取长度大于等于3的字符串a的后三个子字符串,只需a.subString(a.length()-3, a.length());


    再附上经典的一个Java字符串处理例子,集合了subString和startsWith,endsWith,indexOf用法

    public class StringDemo{    
    public static void main(String args[]){
          String s1="this is my original string";
          String sd="original";
          if (s1.startsWith(sd)) //startsWith()方法判断字符串s1是否从字符串sd开始
             s1=s1.substring(sd.length());
          else
             if(s1.endsWith(sd)) //endWith()方法判断字符串s1是否从字符串sd结尾
                 s1=s1.substring(0,s1.length()-sd.length());
             else
             {
                   int index=s1.indexOf(sd); //indexOf()搜索字符或子字符串首次出现,这里的index等于11
                   if(index!=-1)
                   {
                      String s2=s1.substring(0,index); //从字符串s1的首字符开始,取index个字符
                      String s3=s1.substring(index+sd.length());//取字符串s1的第19个字符后面的字符串
                      s1=s2+s3;
                   }
                   else
                   System.out.println("string /""+sd+"/" not found");
             }
             System.out.println(s1);
          }
    } 

    OK,弄懂上面的,这道题就能很快写出来了:

    import java.math.BigInteger;
    import java.util.Scanner;
    import java.math.BigDecimal;
    
    public class Main
    {
    	public static void main(String args[])
    	{
    		Scanner in = new Scanner(System.in);	
    		while(in.hasNext())
    		{
    			BigDecimal ans = in.nextBigDecimal();
    			int n = in.nextInt();
    			String res = ans.pow(n).stripTrailingZeros().toPlainString(); //整数去掉小数点和后面的0
    			if(res.startsWith("0")) //去掉前导0
    			{
    				res = res.substring(1);
    			}
    			System.out.println(res);
    		}
    	}
    }
    

    这道题奇怪的就是前导0,如果是0.几几几,前面的第一个0也要去掉,整数位直接不要了,所以就用substring截取小数点和小数点之后的。去掉后导0和展开表示(不用科学计数表示)用stripTrailingZeros().toPlainString()就行了。




  • 相关阅读:
    python求余、除法运算、向下圆整、round圆整
    【转】从入门到实践 json练习详解~~和ython : groupby 结果浅解,&之后的 y_list=[v for _,v in y]
    ### 模块“*.dll”已加载,但对DllRegisterServer的调用失败,错误代码为0x80070005
    python从excel里读取数据
    文本文件和二进制文件的区别
    析构函数 声明为protected
    c语言中ln,lg,log的表示。c语言中ln,lg,log的表示。
    js设计模式--创建型--单例模式
    js设计模式--创建型--工厂模式
    解决ElementUI的table组件在flex布局下宽度不能自适应的问题
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256691.html
Copyright © 2011-2022 走看看