杂题之 一行式子求网页页数
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 = (余数 + m - 1 = 0 + m - 1 = m - 1) < m, 于是value / m = 0;
当余数>=1时, value = (余数 + 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 = ( (n - n/m*m) + (m - 1) ) / m
好了,问题解决,可以踏实睡了,呵呵。
欢迎指正与指点。