帮本科生写个 java 作业,居然不会做了……

2016-03-08 11:01:08 +08:00
 stupidcat
有一个自然数类 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) {}
3379 次点击
所在节点    问与答
15 条回复
stupidcat
2016-03-08 11:03:47 +08:00
题目原话是“ find a recursive solution ”。可是这个除以 2 ,要怎么 recurse 呢??
huamiao
2016-03-08 12:09:30 +08:00
这涉及到数学方法?感觉是利用乘 10 再加上某个数,以及除 10 和得到的余数,通过判断商是否为 0 来监控计算进程?不过题目有一些不清楚的地方,比如 divideBy2 是否是直接在传入的 NaturalNumber 中进行计算?即按地址返回还是会生成一个值?根据给出的函数名,应该是直接对 n 进行操作,那么这样会涉及到某些奇数除 2 是不能整除的,这里怎么处理?按照题目的要求,看上去是给出一个被 10 整除的商?例如输入 3 则输出为 1 ,输入 7 则输出为 3 ?
stupidcat
2016-03-08 12:11:51 +08:00
@huamiao 就是整除运算, 7/2=3 这样,直接修改参数中的 NaturalNumber n
shiji
2016-03-08 12:29:59 +08:00
网上找的,供参考:
http://pastebin.com/E76kV1Zb
shiji
2016-03-08 12:33:26 +08:00
如果是给别人写作业,千万别直接抄,使劲改改,某些国家作业查抄袭很高科技
czb
2016-03-08 12:42:58 +08:00
Academic dishonesty ^_^
huamiao
2016-03-08 12:56:53 +08:00
把自己分成 10 份的话,那么除以二就是减去自己的 1/10 五次。因为这里的函数只允许增加,所以除以二就是把自己的 1/10 加五次?感觉是这样的。
stupidcat
2016-03-08 14:26:22 +08:00
@huamiao 不允许用 NaturalNumber 直接做加减法
stupidcat
2016-03-08 14:31:47 +08:00
虽然意义不大,我还是说一下吧……
#4 那个方法还是挺巧妙的,每次先做两次 divideBy10(),得到当前数字的最后两位,这样就可以得到一位商,然后用 multiplyBy10(int k)把倒数第二位加回去,再调用 divideBy2(),这就递归了……
aheadlead
2016-03-08 14:33:34 +08:00
把十进制数的每一位取出来 然后手动除法如何
zhjits
2016-03-08 15:12:31 +08:00
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 不太会写,将就着看个大概思路吧。
songpengf117
2016-03-08 16:21:38 +08:00
#4 lastDigit = lastDigit / 2 是几个意思 ?
songpengf117
2016-03-08 16:44:01 +08:00
transferFrom 不需要解释一下吗
huamiao
2016-03-08 16:46:21 +08:00
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 也是可以达到目的的。
SoloCompany
2016-03-08 20:32:01 +08:00
居然设计成 Mutable

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/261856

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX