всем привет, я студент, у которого в программе есть информатика. нам задали вот такую задачу на с++.
Вывести в порядке выбытия номера последних трех из N участников, считающихся начиная с первого "по кругу" считалкой из M слов, с выбытием каждого участника, на котором текст считалки заканчивается
в интернете есть достаточно легкий способ с помощью рекурсии найти последнего выжившего, однако из-за необходимости найти 3х последних, я решила писать в лоб. вот что у меня получилось:
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| #include <iostream>
using namespace std;
int Last_Iosif(int n, int m){
bool *persons = new bool[n];
for (int i = 0; i < n; i++){
persons[i] = true;
} //create a bool massive, all people are alive(true)
int counter = 0; // as a on whom is the count now
int num = -1;
for (int i = 0; i < n; i++){
while (counter < m){
num = (num + 1) % n;
if(persons[num] == true){
counter++;//because we need to count only alive persons
}
}
counter = 0;
persons[num] = false; // man number num died
}
delete [] persons; //get free a memory
return num + 1 ; // the last man, who lives
}
int Pre_Last_Iosif(int n, int m){
bool *persons = new bool[n];
for (int i = 0; i < n; i++){
persons[i] = true;
}
int counter = 0;
int num = -1;
for (int i = 0; i < n-1; i++){ //we do only n-1 steps now
while (counter < m){
num = (num + 1) % n;
if(persons[num] == true){
counter++;
}
}
counter = 0;
persons[num] = false;
}
delete [] persons;
return num + 1 ;
}
int Pre_Pre_Last_Iosif(int n, int m){
bool *persons = new bool[n];
for (int i = 0; i < n; i++){
persons[i] = true;
}
int counter = 0;
int num = -1;
for (int i = 0; i < n-2; i++){ //we do only nn-2 steps now
while (counter < m){
num = (num + 1) % n;
if(persons[num] == true){
counter++;
}
}
counter = 0;
persons[num] = false;
}
delete [] persons;
return num + 1 ;
}
int main(){
int n, m;
cout << "Please say a number of participants: ";
cin >> n;
cout <<'\n'<<"Say a number of words: ";
cin >> m;
cout << "\n" <<"Latest retired are numbers: " << Pre_Pre_Last_Iosif(n,m)<<' '<<Pre_Last_Iosif(n,m)<<' '<< Last_Iosif(n, m) << endl;
return 0;
} |
|
программа работает правильно, однако из-за трёх практически одинаковых функций мне сказали улучшить её до одной функции. я попыталась добавить в функцию ещё один цикл, который бы делал шаги и вернуть массив из 3х чисел. но cpu переполняется. я подозреваю, что где-то проблема с циклом для k, но не могу понять, в чем конкретно проблема. также возможно, что я неправильно переоформила три функции в одну и неправильно вывожу массив. прошу мне помочь, указав причину переполняющейся cpu и возможно вы знаете, как правильно решить задачу на 3 числа через одну функцию.
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| #include <iostream>
using namespace std;
int *Iosif(int n, int m){
int *latest = new int[3];
bool *persons = new bool[n];
for (int i = 0; i < n; i++){
persons[i] = true;
}
int counter = 0;
int num = -1;
for (int k=0; k < 3; k++){
for (int i = 0; i < n -k ; i++){
while (counter < m) {
num = (num + 1) % n;
if(persons[num] == true) counter++;
}
counter = 0;
persons[num] = false;
}
latest[k] = ++num;
}
delete [] persons;
return latest;
delete [] latest;
}
int main(){
int n, m;
cout << "Enter a number of persons >> ";
cin >> n;
cout <<"\nEnter an ordinal number >> ";
cin >> m;
int* pointer = Iosif(n, m);
cout << "\n" << pointer[2]<< ' '<< pointer[1]<< ' '<< pointer[0] << endl;
delete [] pointer;
return 0;
} |
|
прошу мне помочь, указав причину переполняющейся cpu и возможно вы знаете, как правильно решить задачу на 3 числа через одну функцию.