题解 | #函数求值#
函数求值
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(); } }