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

查看12道真题和解析