喊7过
题目:
喊7是一个传统的聚会游戏,N个人围成一圈,按顺时针从1到N编号。每一轮游戏,从编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1, 但是当将要喊出来的数字是7的倍数或者数字本身含有7的话,不能把这个数字直接喊出来, 而是要喊"过"。假定玩这个游戏的N个人都没有失误地在正确的时机喊了"过",当喊到数字K时,可以统计每个人喊"过"的次数。现给定一个长度为N的数组,存储了打乱顺序的每个人喊"过"的次数,请把它还原成正确的顺序,即数组的第i个元素存储编号i的人喊"过"的次数。
思路:
根据输入的数字相加可以得到喊“过”的次数和总人数
根据模拟发现 (报数/总人数)的余数 -1 就等于报数人的下标(下标从0开始所以需要-1) 总人数为5:喊1的下标为0;喊2 的下标为1。。。喊6的下标为0(6%5-1)
根据2的规律就可以筛选出符合条件的下标,然后再做叠加的动作
`
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split(" ");
int len = s.length;
int[] ints = new int[len];
int num = 0;
for(int i=0;i<len;i++){
num+=Integer.valueOf(s[i]); //计算出符合的次数
}
int step = 7; //直接从7开始
while (num>0){
if(step%7==0 || String.valueOf(step).contains("7")){
ints[(step-1)%len]++; //同过数组长度算出符合的下标
num--; //符合的次数递减
}
step++; //报数的次数递增
}
String res = "";
for(int i=0;i<len;i++){
res+=String.valueOf(ints[i]);
if(i == len-1){
break;
}
res+=" ";
}
System.out.println(res);
}
}
`