题解 | #函数求值#

函数求值

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();
    }
}

全部评论

相关推荐

07-11 22:27
中南大学 Java
程序员牛肉:学历的话没问题。但是没问题的也就只有学历了。 其实你的整体架构是正确的,博客接着干。但是项目有点过于简单了。从后端的角度上讲,你这也就是刚入门的水平,所以肯定约面试够呛。 如果你要应聘后端岗位,那你第一个项目竟然是仿写操作系统。这个你要面试官咋问你。你一定要记住一点,你简历上写的所有的东西,都是为了证明你有能力胜任当前的岗位,而不是为了证明你自己会什么。 如果你只是浅浅的做几个项目,描述也都是烂大街。技术点也都是各种混水类的配置类需求,那你就不要幻想自己能走多远。一定要保持思考,保持学习。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务