编程题硬币反转怎么做

时间:2025-01-26 20:17:49 网络游戏

硬币翻转问题可以通过编程解决,以下是几种不同的解决方案:

解决方案1:使用布尔数组

我们可以使用一个布尔数组来表示硬币的状态,其中`true`表示硬币正面向上,`false`表示硬币反面向上。然后根据每个人的操作翻转相应的硬币。

```cpp

include

include

using namespace std;

int main() {

int n, m;

cin >> n >> m;

vector coins(n + 1, true); // 初始化所有硬币为正面向上

for (int i = 1; i <= m; ++i) {

for (int j = i; j <= n; j += i) {

coins[j] = !coins[j]; // 翻转硬币

}

}

// 输出正面向上的硬币编号

for (int i = 1; i <= n; ++i) {

if (coins[i]) {

cout<< i << " ";

}

}

cout << endl;

return 0;

}

```

解决方案2:使用位操作

我们可以使用位操作来表示硬币的状态,其中每个硬币的状态可以用一个整数的二进制位来表示。然后根据每个人的操作翻转相应的位。

```cpp

include

using namespace std;

int main() {

int n, m;

cin >> n >> m;

int state = (1 << n) - 1; // 初始化所有硬币为正面向上

for (int i = 1; i <= m; ++i) {

for (int j = i; j <= n; j += i) {

state ^= (1 << j); // 翻转硬币

}

}

// 输出正面向上的硬币编号

for (int i = 1; i <= n; ++i) {

if (state & (1 << i)) {

cout<< i << " ";

}

}

cout << endl;

return 0;

}

```

解决方案3:模拟翻转过程

我们可以通过模拟每个人的操作来翻转硬币,并记录每个硬币的最终状态。

```cpp

include

include

using namespace std;

int main() {

int n, m;

cin >> n >> m;

vector coins(n + 1, 1); // 初始化所有硬币为正面向上

for (int i = 1; i <= m; ++i) {

for (int j = i; j <= n; j += i) {

coins[j] = 1 - coins[j]; // 翻转硬币

}

}

// 输出正面向上的硬币编号

for (int i = 1; i <= n; ++i) {

if (coins[i] == 1) {

cout<< i << " ";

}

}

cout << endl;

return 0;

}

```

总结

以上三种解决方案都可以有效地解决硬币翻转问题。选择哪种解决方案取决于具体的需求和编程习惯。布尔数组和位操作方法在空间和时间复杂度上较为优越,而模拟翻转过程则更直观易懂。