首页 > 代码库 > 杂题之 一行式子求网页页数

杂题之 一行式子求网页页数

1.问题描述:网页商城中每一页的商品数量是有限的,现在给出总数n (n > 0)件商品,且每页只允许显示m(m > 0)件商品

      现在要求一行表达式来计算出显示所有商品一共需要多少网页? 要求: 只能用一行表示出来,

      并且只能用(括号,加减乘除)运算符,其它的如比较运算符等都不可以用。

2.开始我没读懂题目,以为考察的是( A?B :C)操作,所以我开始我给出的答案是:

  return (m >= n) ? 1 : ( ((n - n/m*m) > 0) ? n/m + 1 : n/m)

结果不是那么回事。。。要求是只用加减乘除和括号求得一个表达式来计算出这个值。

3.问题分析:

  这个问题思路显然是这样:

  1). n/m算出需要多少满页(即每页显示m个商品)

  2). 判断 n%m是为0,若为0,表示n除以m可以除尽,结果为 n/m + 0  ;若大于0,则另需一页显示,即结果为 n/m + 1;

  

  那么重点就是判断 n % m是否大于0.显然题目要求不能用取余运算符(%),那么我们要另想算出余数的办法。

    根据本题条件直接给出结果: n % m = n - [n/m] * m.  其中[n/m]为小于或等于[n/m]的最大整数。

    因为n,m都为整数,所以 直接写成: n % m = n - n/m*m;

    求余数的方法有了,接下来的问题是这样:如果余数为0,结果为 n/m + 0 ;但是如果大于0,结果为  n/m + 1,余数可以是小于m的任意整数,

  那么怎么利用 当这个余数大于0时,就变成 + 1.也就是如何在余数不知道是多少时,都可以得到 1,那么如何根据余数得到是加0还是加1呢?

    方法:观察得知,当余数为0时, value = http://www.mamicode.com/(余数 + m - 1 = 0 + m - 1 = m - 1) < m, 于是value / m = 0;

            当余数>=1时, value = http://www.mamicode.com/(余数 + m - 1 ) >= m 且 value < 2* m , 于是value / m = 1;

  这样一来便可以了,用余数加上 m - 1 然后再除以 m , 倘若余数为0,则 (0 + m - 1) / m = 0;

    若余数大于等于1,设为x(1 <= x < m)则 m <= (x + m - 1) < 2* m. 则 (x + m - 1) / 2 = 1;

  这样一来刚好满足需求。于是这个符合题意的表达式便成为:

    return ( n / m + ( (n - n/m*m) + (m - 1) ) / m); 

 

  总结:经过以上分析得出这个问题主要需要解决两方面:

  1)如何在 不用取余操作符的情况下,得到余数   : (n - [n/m] * m)

  2)当余数的值不知道,如何在不用判断语句的情况下得到需要加0,还是加1.   :value = http://www.mamicode.com/( (n - n/m*m) + (m - 1) ) / m

  

  好了,问题解决,可以踏实睡了,呵呵。

  欢迎指正与指点。

   

杂题之 一行式子求网页页数