V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
stupidcat
V2EX  ›  问与答

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

  •  
  •   stupidcat · 2016-03-08 11:01:08 +08:00 · 3371 次点击
    这是一个创建于 2971 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个自然数类 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) {}
    第 1 条附言  ·  2016-03-08 14:40:15 +08:00
    已经做好了,大家没有必要回复了……#4 有代码,#9 有题解……
    15 条回复    2016-03-08 20:32:01 +08:00
    stupidcat
        1
    stupidcat  
    OP
       2016-03-08 11:03:47 +08:00
    题目原话是“ find a recursive solution ”。可是这个除以 2 ,要怎么 recurse 呢??
    huamiao
        2
    huamiao  
       2016-03-08 12:09:30 +08:00
    这涉及到数学方法?感觉是利用乘 10 再加上某个数,以及除 10 和得到的余数,通过判断商是否为 0 来监控计算进程?不过题目有一些不清楚的地方,比如 divideBy2 是否是直接在传入的 NaturalNumber 中进行计算?即按地址返回还是会生成一个值?根据给出的函数名,应该是直接对 n 进行操作,那么这样会涉及到某些奇数除 2 是不能整除的,这里怎么处理?按照题目的要求,看上去是给出一个被 10 整除的商?例如输入 3 则输出为 1 ,输入 7 则输出为 3 ?
    stupidcat
        3
    stupidcat  
    OP
       2016-03-08 12:11:51 +08:00
    @huamiao 就是整除运算, 7/2=3 这样,直接修改参数中的 NaturalNumber n
    shiji
        4
    shiji  
       2016-03-08 12:29:59 +08:00   ❤️ 2
    网上找的,供参考:
    http://pastebin.com/E76kV1Zb
    shiji
        5
    shiji  
       2016-03-08 12:33:26 +08:00
    如果是给别人写作业,千万别直接抄,使劲改改,某些国家作业查抄袭很高科技
    czb
        6
    czb  
       2016-03-08 12:42:58 +08:00 via Android
    Academic dishonesty ^_^
    huamiao
        7
    huamiao  
       2016-03-08 12:56:53 +08:00
    把自己分成 10 份的话,那么除以二就是减去自己的 1/10 五次。因为这里的函数只允许增加,所以除以二就是把自己的 1/10 加五次?感觉是这样的。
    stupidcat
        8
    stupidcat  
    OP
       2016-03-08 14:26:22 +08:00
    @huamiao 不允许用 NaturalNumber 直接做加减法
    stupidcat
        9
    stupidcat  
    OP
       2016-03-08 14:31:47 +08:00
    虽然意义不大,我还是说一下吧……
    #4 那个方法还是挺巧妙的,每次先做两次 divideBy10(),得到当前数字的最后两位,这样就可以得到一位商,然后用 multiplyBy10(int k)把倒数第二位加回去,再调用 divideBy2(),这就递归了……
    aheadlead
        10
    aheadlead  
       2016-03-08 14:33:34 +08:00
    把十进制数的每一位取出来 然后手动除法如何
    zhjits
        11
    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
        12
    songpengf117  
       2016-03-08 16:21:38 +08:00
    #4 lastDigit = lastDigit / 2 是几个意思 ?
    songpengf117
        13
    songpengf117  
       2016-03-08 16:44:01 +08:00
    transferFrom 不需要解释一下吗
    huamiao
        14
    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
        15
    SoloCompany  
       2016-03-08 20:32:01 +08:00
    居然设计成 Mutable
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2905 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 14:19 · PVG 22:19 · LAX 07:19 · JFK 10:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.