This topic created in 3741 days ago, the information mentioned may be changed or developed.
有一个自然数类 NaturalNumber ,只允许使用以下六个方法:
1. int divideBy10()
Divides this by 10 and reports the remainder.
2. boolean isZero()
Reports whether this is zero.
3. void multiplyBy10(int k)
Multiplies this by 10 and adds k.
4. void transferFrom(NaturalNumber n)
5. void clear()
6. void newInstance()
(注:不允许使用 toInt()方法)
现在的要求是,使用递归(!)的方法,写一个将 NaturalNumber 除以 2 的函数
private static void divideBy2(NaturalNumber n) {}
Supplement 1 · Mar 8, 2016
已经做好了,大家没有必要回复了……#4 有代码,#9 有题解……
15 replies • 2016-03-08 20:32:01 +08:00
 |
|
1
stupidcat Mar 8, 2016
题目原话是“ find a recursive solution ”。可是这个除以 2 ,要怎么 recurse 呢??
|
 |
|
2
huamiao Mar 8, 2016
这涉及到数学方法?感觉是利用乘 10 再加上某个数,以及除 10 和得到的余数,通过判断商是否为 0 来监控计算进程?不过题目有一些不清楚的地方,比如 divideBy2 是否是直接在传入的 NaturalNumber 中进行计算?即按地址返回还是会生成一个值?根据给出的函数名,应该是直接对 n 进行操作,那么这样会涉及到某些奇数除 2 是不能整除的,这里怎么处理?按照题目的要求,看上去是给出一个被 10 整除的商?例如输入 3 则输出为 1 ,输入 7 则输出为 3 ?
|
 |
|
5
shiji Mar 8, 2016
如果是给别人写作业,千万别直接抄,使劲改改,某些国家作业查抄袭很高科技
|
 |
|
6
czb Mar 8, 2016 via Android
Academic dishonesty ^_^
|
 |
|
7
huamiao Mar 8, 2016
把自己分成 10 份的话,那么除以二就是减去自己的 1/10 五次。因为这里的函数只允许增加,所以除以二就是把自己的 1/10 加五次?感觉是这样的。
|
 |
|
9
stupidcat Mar 8, 2016
虽然意义不大,我还是说一下吧…… #4 那个方法还是挺巧妙的,每次先做两次 divideBy10(),得到当前数字的最后两位,这样就可以得到一位商,然后用 multiplyBy10(int k)把倒数第二位加回去,再调用 divideBy2(),这就递归了……
|
 |
|
10
aheadlead Mar 8, 2016
把十进制数的每一位取出来 然后手动除法如何
|
 |
|
11
zhjits Mar 8, 2016
private static int myToInt(NaturalNumber n) { if (n.isZero()) return 0; return n.divideBy10() + myToInt(n) * 10; } private static void divideBy2(NaturalNumber n) { int ret = NaturalNumber.myToInt(n); n.clear(); n.multiplyBy10(ret >> 1); } 简单粗暴有递归。 Java 不太会写,将就着看个大概思路吧。
|
 |
|
12
songpengf117 Mar 8, 2016
#4 lastDigit = lastDigit / 2 是几个意思 ?
|
 |
|
14
huamiao Mar 8, 2016
private static void rebuildNumber(NaturalNumber n){ int r = n.divideBy10(); if (n.isZero()) { n.multiplyBy10(r * 5); } else { rebuildNumber(n); n.multiplyBy10(r * 5); } } public static void divideBy2(NaturalNumber n) { rebuildNumber(n); n.divideBy10(); }
如果可以有子函数的话,通过每一位+自己的 5/10 也是可以达到目的的。
|