重置号码 java

Reseting number java

所以我在java中遇到了问题,要确定最后一个拿到糖果的孩子是谁,n 是多少 children,m 是多少糖果,s 是第一个拿到糖果的孩子的数量得到了第一颗糖果。 所以基本上如果 n = 4,m = 6,并且 s = 2,答案是 3,因为都是从 2(得到第一颗糖果的孩子的数量)->3->4 开始,然后重新开始到 1->2-> 3 和 3 是最后一个拿到糖果的孩子。 代码 运行 完美,但我在 n = 3333、m =3333 和 s = 1

处遇到错误
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int s = in.nextInt();
        int total = m%n;
        int jaw = total+s-1;
            System.out.print(jaw);
        
        
}

问题是您到达了不存在的人 0 。 3333%3333 = 0 然后 0 + 1 - 1 = 0 由于我们处于循环中,因此 0 是上一轮的最后一个人,即人号 m。 我们解决这个问题的方式是,如果结果为零,我们 return m.

import java.util.Scanner;
class sweets {
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int s = in.nextInt();
        int total = m%n;
        int jaw = total+s-1;
        if(jaw == 0){
                jaw = m;
                }
        System.out.print(jaw);
        }
}

我假设您提到的“错误”是 jaw 是 0,对吗?那是因为 3333%3333 将为 0,因此 0 + s - 1 也将为 0 (0+1-1 = 0).

你的方向是正确的,即m % n会告诉你每个人都得到fair/equal份后还剩多少颗糖果。

现在您只需分发“其余”(total),这意味着您将其“添加”到“第一个 child”(s)。假设这是 c = s + total,那么 c 是最后得到任何东西的 child。您减去 -1 是因为如果您添加任何内容,“光标”会前进到下一个 child,因此您想要回溯。

但是,如果您没有任何东西可以分发怎么办?然后最后一个 child 得到任何东西是第一个 之前,如果是 4 children 并且从 1 开始就是第 4 个。您的计算结果为 0,基本上可以表达这一点。

您的代码可能面临的另一个问题是,如果您从最后一个 child(比如说 4)开始并且有 2 块糖果要分发,那么您将得到“第 5 个”child 而不是最后一个得到东西的“第一个”:2 + 4 - 1 = 5.

那你是怎么解决的?

  • 添加jaw %= n来处理“溢出”(如果你从最后一个child开始,再分发2个糖果,第一个就会得到)
  • 检查是否 jaw == 0 在这种情况下解决方案将是 jaw = n(最后一个 child 得到最后一个糖果)

只要m%n==0就需要考虑。

那么下颌=n-s+1;

只需要添加一个if语句来包含它。