喊7的次数重排
时间限制:1秒 | 内存限制:262144K | 语言限制:不限
题目描述:
喊7是一个传统的聚会游戏,N个人围成一圈,按顺时针从1到N编号。编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1,但是当将要喊出来的数字是7的倍数或者数字本身含有7的话,不能把这个数字直接喊出来,而是要喊"过"。假定玩这个游戏的N个人都没有失误地在正确的时机喊了"过",当喊到数字K时,可以统计每个人喊"过"的次数。
现给定一个长度为N的数组,存储了打乱顺序的每个人喊"过"的次数,请把它还原成正确的顺序,
示例1(代表3个参与,其中一个人喊了1次过,另2个人没有喊过)
输入
0 1 0
输出
1 0 0
示例2 (代表5个人参与,其中1个人喊了2次过,1个喊了1次过,另外3个人没喊过)
输入
0 0 0 2 1
输出
0 2 0 1 0
示例3
输入 (代表7个人参与,其中1个人喊了6次过,3个人各喊了一次过,另外3个人没有喊过)
0 0 0 6 1 1 1
输出
0 1 1 0 0 1 6
代码:
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
bool Is7(int n)
{
if (n % 7 == 0)
{
return true;
}
string str = to_string(n);
for (int i = 0; i < str.size(); i++)
{
if (str[i] == '7')
{
return true;
}
}
return false;
}
int main()
{
string str;
getline(cin, str);
vector<int> vec;
string tmp;
stringstream ss(str);
while (getline(ss, tmp, ' '))
{
vec.push_back(atoi(tmp.c_str()));
}
int n7 = 0; // 喊过的总数
for (auto tmp : vec)
{
n7 += tmp;
}
int persons = vec.size(); // 人数
vector<int> v(persons + 1); // 从索引1开始保存有效值
int nb = 1; // 从1开始喊
while (n7 > 0)
{
if (Is7(nb))
{
int index = nb% persons; // 喊过的人索引
if (index == 0)
{
index = persons;
}
v[index]++;
n7--;
}
nb++;
}
for (int i = 1; i < v.size(); i++)
{
cout << v[i] << " ";
}
return 0;
}
输入
0 1 0
预期输出
1 0 0
实际输出
输入
0 0 0 2 1
预期输出
0 2 0 1 0
实际输出
输入
0 0 0 6 1 1 1
预期输出
0 1 1 0 0 1 6
实际输出
输入
1 1 1 1 2 2 2 3
预期输出
3 1 2 1 2 1 2 1
实际输出