stupidcat
V2EX  ›  问与答

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

  •  
  •   stupidcat · Mar 8, 2016 · 4061 views
    This topic created in 3740 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
    stupidcat
        1
    stupidcat  
    OP
       Mar 8, 2016
    题目原话是“ find a recursive solution ”。可是这个除以 2 ,要怎么 recurse 呢??
    huamiao
        2
    huamiao  
       Mar 8, 2016
    这涉及到数学方法?感觉是利用乘 10 再加上某个数,以及除 10 和得到的余数,通过判断商是否为 0 来监控计算进程?不过题目有一些不清楚的地方,比如 divideBy2 是否是直接在传入的 NaturalNumber 中进行计算?即按地址返回还是会生成一个值?根据给出的函数名,应该是直接对 n 进行操作,那么这样会涉及到某些奇数除 2 是不能整除的,这里怎么处理?按照题目的要求,看上去是给出一个被 10 整除的商?例如输入 3 则输出为 1 ,输入 7 则输出为 3 ?
    stupidcat
        3
    stupidcat  
    OP
       Mar 8, 2016
    @huamiao 就是整除运算, 7/2=3 这样,直接修改参数中的 NaturalNumber n
    shiji
        4
    shiji  
       Mar 8, 2016   ❤️ 2
    网上找的,供参考:
    http://pastebin.com/E76kV1Zb
    shiji
        5
    shiji  
       Mar 8, 2016
    如果是给别人写作业,千万别直接抄,使劲改改,某些国家作业查抄袭很高科技
    czb
        6
    czb  
       Mar 8, 2016 via Android
    Academic dishonesty ^_^
    huamiao
        7
    huamiao  
       Mar 8, 2016
    把自己分成 10 份的话,那么除以二就是减去自己的 1/10 五次。因为这里的函数只允许增加,所以除以二就是把自己的 1/10 加五次?感觉是这样的。
    stupidcat
        8
    stupidcat  
    OP
       Mar 8, 2016
    @huamiao 不允许用 NaturalNumber 直接做加减法
    stupidcat
        9
    stupidcat  
    OP
       Mar 8, 2016
    虽然意义不大,我还是说一下吧……
    #4 那个方法还是挺巧妙的,每次先做两次 divideBy10(),得到当前数字的最后两位,这样就可以得到一位商,然后用 multiplyBy10(int k)把倒数第二位加回去,再调用 divideBy2(),这就递归了……
    aheadlead
        10
    aheadlead  
       Mar 8, 2016
    把十进制数的每一位取出来 然后手动除法如何
    zhjits
        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 不太会写,将就着看个大概思路吧。
    songpengf117
        12
    songpengf117  
       Mar 8, 2016
    #4 lastDigit = lastDigit / 2 是几个意思 ?
    songpengf117
        13
    songpengf117  
       Mar 8, 2016
    transferFrom 不需要解释一下吗
    huamiao
        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 也是可以达到目的的。
    SoloCompany
        15
    SoloCompany  
       Mar 8, 2016
    居然设计成 Mutable
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4177 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 00:57 · PVG 08:57 · LAX 17:57 · JFK 20:57
    ♥ Do have faith in what you're doing.