北京大学的约翰捕鱼问题c语言代码
时间: 2023-10-15 20:08:30 浏览: 93
约翰捕鱼问题是一个经典的数学问题,可以用 C 语言来解决。以下是一个实现约翰捕鱼问题的 C 语言代码示例:
```
#include <stdio.h>
int main() {
int n, m;
scanf("%d %d", &n, &m);
int ans = 0;
for (int i = 2; i <= n; i++) {
ans = (ans + m) % i;
}
printf("%d", ans + 1);
return 0;
}
```
代码中,首先读入两个整数 n 和 m,分别表示游戏中的鱼数和每次报数的数字。然后使用循环计算出最终留下来的鱼的编号。具体来说,我们从第二条鱼开始,每次报数到 m 的鱼会被淘汰,直到只剩下一条鱼为止。在每次淘汰鱼后,我们需要将编号重新映射到 0 到 i-1 的范围内,这可以使用取模运算实现。最后留下的鱼的编号即为答案,需要将其加一输出。
相关问题
小约翰的游戏C语言蓝桥杯
我不知道你想了解什么关于小约翰的游戏C语言蓝桥杯的内容,以下是一些可能有用的信息:
小约翰的游戏是一道蓝桥杯算法题,要求用C语言实现一个简单的游戏。具体要求如下:
有一个n*m的棋盘,每个位置上都有一个数字,表示在这个位置上可以获得的分数。玩家从左上角开始,每次可以向右或向下移动一格,直到到达右下角。玩家所经过的位置上的数字都会被累加到分数中,最终得分就是所经过位置上数字的和。
要求程序输出玩家能够获得的最大分数。
这道题可以用动态规划的方法解决。具体思路是,设f[i][j]表示从起点到位置(i,j)所能获得的最大分数。则有如下递推式:
f[i][j] = max(f[i-1][j], f[i][j-1]) + a[i][j]
其中a[i][j]表示在位置(i,j)上的分数。最终答案就是f[n][m]。
需要注意的是,如果直接按照上述递推式计算,会出现数组越界的问题。因此需要在数组a的周围加上一圈0,即a[0~n+1][0~m+1],同时在计算f[i][j]时需要特判i=1或j=1的情况,此时应该用a[i][j]加上之前的f[i-1][j]或f[i][j-1]。
这道题的时间复杂度为O(nm),空间复杂度也为O(nm)。可以通过蓝桥杯的测试。
用C语言约翰有个整数数组。 约翰每次给数组中所有非零数都加上一个相等的数,可以加负数。 约翰希望尽快让数组变得全是0。
这是一个经典的谜题,也被称为“平衡数列”或“零和游戏”。针对这个问题,我们可以使用贪心算法来解决。
假设数组的长度为n,我们可以先将数组从小到大排序。然后,我们从数组的最小值开始,依次将每个非零数减去前面所有数的和,直到它变为0或者变成负数。这样做的原理在于,我们可以尽可能地让小的数先变成0,从而为后面的数创造更多的机会变成0。
下面是用C语言实现这个算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int main() {
int n;
scanf("%d", &n);
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
qsort(a, n, sizeof(int), compare);
int sum = 0, ans = 0;
for (int i = 0; i < n; i++) {
sum += a[i];
ans += abs(sum);
}
printf("%d", ans);
return 0;
}
```
这个算法的时间复杂度为O(nlogn),其中n为数组的长度。
阅读全文