题解 | #函数求值#

函数求值

https://www.nowcoder.com/practice/20d6abf0fbcc49a799024e61fa2292c6

import javax.xml.stream.StreamFilter;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.chrono.ChronoPeriod;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;


public class Main {
    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        while (sc.hasNext()){
            BigDecimal big=sc.nextBigDecimal();
            System.out.println(countDigitOne(big));
        }
    }
    public static BigInteger countDigitOne(BigDecimal n) {
        BigDecimal digit =new BigDecimal(1) ;
        BigDecimal res =new BigDecimal(0) ;
        BigDecimal high = n.divide(new BigDecimal(10),RoundingMode.DOWN);
        BigDecimal cur = n.remainder(new BigDecimal(10)) ;
        BigDecimal low = new BigDecimal(0);
        BigDecimal digit2 =new BigDecimal(1) ;
        BigDecimal high2 = n.divide(new BigDecimal(10),RoundingMode.DOWN);
        BigDecimal cur2 = n.remainder(new BigDecimal(10)) ;
        BigDecimal low2 = new BigDecimal(0);
        BigDecimal zero=new BigDecimal(0);
        while(!high .equals(zero) || !cur.equals(zero)) {
            if(cur.equals(zero)) res=res.add(high.multiply(digit));
            else if(cur.equals(new BigDecimal(1))) res=res.add( high.multiply( digit)) .add(low) .add(new BigDecimal(1));
            else res =res.add (high.add(new BigDecimal(1)) .multiply( digit));
            low =low.add( cur .multiply( digit));
            cur = high.remainder(new BigDecimal(10) );
            high =high.divide(new BigDecimal(10), RoundingMode.DOWN);
            digit =digit.multiply(new BigDecimal(10));
        }
        while(!high2 .equals(zero) || !cur2.equals(zero)) {
            if(cur2.compareTo(new BigDecimal(2))<0) res=res.add(high2.multiply(digit2));
            else if(cur2.compareTo(new BigDecimal(2))==0) res=res.add( high2.multiply( digit2)) .add(low2) .add(new BigDecimal(1));
            else res =res.add (high2.add(new BigDecimal(1)) .multiply( digit2));
            low2 =low2.add( cur2 .multiply( digit2));
            cur2 = high2.remainder(new BigDecimal(10) );
            high2 =high2.divide(new BigDecimal(10),RoundingMode.DOWN);
            digit2 =digit2.multiply(new BigDecimal(10));
        }
        return res.remainder(new BigDecimal(20123)).toBigInteger();
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务