题目描述
喊7 是一个传统的聚会游戏,N个人围成一圈,按顺时针从1-7编号。
编号为1的人从1开始喊数,下一个人喊得数字是上一个人喊得数字+1。
但是当将要喊出数字7的倍数或者含有7的话,不能喊出 而是要喊过。
假定N个人都没有失误。当喊道数字k时,可以统计每个人喊 “过"的次数。
现给定一个长度n的数组,存储打乱的每个人喊”过"的次数,请把它还原成正确顺序,即数组的第i个元素存储编号i的人喊“过“的次数。
输入描述
输入为1行,空格分割的喊过的次数, 注意k并不提供,k不超过200,数字个数为n。
输出描述
输出为1行,顺序正确的喊过的次数 空格分割。
示例1
输入
0 1 0
输出
1 0 0
说明:只有一次过,发生在7,按顺序编号1的人遇到7 所以1 0 0,结束时的k不一定是7 也可以是 8 9, 喊过都是1 0 0。
示例2
输入
0 0 0 2 1
输出
0 2 0 1 0
说明:一共三次喊过,发生在7 14 17,编号为2 的遇到7 17,编号为4 的遇到14。
思路分析
- 输入个数n就是参与人数。
- 编号为1的人从1开始喊数,下一个人喊得数字是上一个人喊得数字+1。
- 数字7的倍数或者含有7,喊过。
- N个人都没有失误,即所有人都没有失误,都正确的根据规则喊了。
- k并不提供,k不超过200。
参考代码
注:题目网上找的,参考代码是练习用,仅供参考,并不保证用例通过率。
import java.util.Scanner;/*** 喊7游戏*/
public class Test0016 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String[] timesStr = scanner.nextLine().split(" ");// 计算所有人喊过的总次数int totalTimes = 0;for (String s : timesStr) {totalTimes += Integer.parseInt(s);}// 初始化每个人喊过的次数的数组容器int[] times = new int[timesStr.length];// 遍历数字,i最大值大于200int count = 0;int peopleNum;for (int i = 1; i < 300; i++) {// 当前喊出数字7的倍数或者含有7if (i % 7 == 0 || String.valueOf(i).contains("7")) {count++;// 计算当前是第几个人喊得peopleNum = i % timesStr.length;// 当前的人,喊过的次数加1// 人是从1开始,所以对应数组下表要减1times[peopleNum - 1] += 1;// 达到次数结束掉if (count == totalTimes) {break;}}}// 输出结果StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < times.length; i++) {stringBuilder.append(times[i]);if (i < times.length - 1) {stringBuilder.append(" ");}}System.out.println(stringBuilder);}
}