重置号码 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语句来包含它。
所以我在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语句来包含它。