我为家庭作业编写了一些代码,但我认为它没有用。这是约瑟夫斯问题的代码

时间:2019-11-30 08:51:59

标签: java optimization

以下是我需要做作业的规则:

n个人围成一圈站着。从第1个人开始,将执行第2个人。重复此操作,直到最后一个人还活着,然后我们将其返回圈子。

例如,对于:

  • n = 1,最后一个人是1。
  • n = 2,最后一个人是1。
  • n = 3,最后一个人是3。
  • n = 4,最后一个人是1。
  • n = 5,3是最后一个人。
  • n = 6,最后一个人是5。 如果我解释错了,这是指向Wikipedia页面的链接。

这是我的Java代码。

const observer = new IntersectionObserver(([entry]) => {
  console.log("called");
  setIsVisible(entry.isIntersecting);
  setIntersectionRatio(entry.intersectionRatio);
}, {
  threshold: 0.9
});

据我所知,此代码无法正常工作。 对于输入1到15,它似乎按预期工作。但是,在输入16处,我得到的答案是3(假设为1),据我所知,此后的所有答案都变得不正确。 您能告诉我代码有什么问题吗?

我想尽可能使用此代码,因为它是用于家庭作业的,因此原创作品比更好/更有效的代码更有价值。这就是为什么我不想使用例如位移解决方案的原因。我自己没想到。

1 个答案:

答案 0 :(得分:0)

谢谢大家,尤其是JB Nizet帮助我更好地写了我的问题。我弄清楚了为什么我的代码无法正常工作。当我说设计可能存在缺陷时,我是对的。当我在纸上写它时,我错误地估计了一个基于缺陷的公式。

基本上,我写了1,2,4,7。并假设在其余序列中都是如此。我算错了。应该是1,2,4,8。换句话说,是2的倍数。 这是新代码。

//Question 4
        int num4 = MyConsole.readInt("Please enter a Number(integer) of people which you want me to test what is the safe spot in a Josephus problem: ");
        int reducer = 1;
        while (num4 > reducer){
            num4 -= reducer;
            reducer *= 2;
        }
        num4 = 1 + (num4-1)*2;
        MyConsole.printPrompt("The Safe spot for the entered number is " + Integer.toString(num4));