举例说明:以216为例,注意216是一个相当特殊的数字,从1到216这216个数中,个位是1的情况有1 11 21 31 41 51 .... 211 ,(注意这个11,这里虽然出现了两个1,但是下一步固定十位为1的时候会考虑到)这里一共有1~21=21 +1(001种) 也就是216/10+1;然后是十位数,11,12,13,14,15...19;(10个) 110,111,112,113...119;(10个) 210,211,212...216(6+1,加1是因为0到6) 这里我们发现,从1到216这216个数中,固定十位数为1的情况有 10*2+6+1,想到这里,我们应该能够理解为什么需要把216这个数字拆分成a=n/m和b=n%m了,因为我们需要单独考虑210到216这7个数,此时(考虑10位数的时候)除了a/2(其实就是百位数)*10=20以外,还要加上b+1;假如n不是216,而是206,则取不到210到216这7个数,假如n是226,则会取到210到219这10个数,由此可见,只有a的末位为1时才需要考虑取不满m个的情况,故a % 10 == 1时,要加上b+1;再考虑n=226的情况,此时由于可以取到210到219这10个数,所以固定十位数为1的情况有(a/10+1)*10;那n=236呢?也是(a/10+1)*10,接着往后想一直到306,都是30,而316是30+7,据此可以判断,只有0/1是特殊的,在程序实现中这么处理这个特殊呢?可以加一个判断,或者用a+8避免这个判断,之所以是+8,通过上面的分析很明显可以理解,是因为当a的次低位为0或者1时,a/10==(a+8)/10,当a的次低位>=2,补8会产生进位位,效果等同于(a/10+1)
8

相关推荐

01-14 16:23
广州商学院 Java
双非后端失败第N人:如果准备好了可以直接投字节,字节是最不看学历的,只要想面,大概率都能给你约面。
双非有机会进大厂吗
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务