优化这段代码#include <stdio.h> int josephus(int n, int m) { int j = 0; for (int i = 2; i <= n; i++) { j = (j + m) % i; } return j + 1; } int main() { int n, m; scanf("%d%d", &n, &m); int sum = josephus(n, m); printf("%d\n", sum); return 0; }
时间: 2024-03-08 10:45:45 浏览: 158
这段代码是求解约瑟夫问题的代码,算法本身已经是比较优化的了,不过还有一些可以改进的地方。
1. 对于循环中的变量 i,可以使用 unsigned int 类型,避免可能出现的负数问题。
2. 对于循环中的变量 j,可以使用 int 类型,但是可以初始化为 -1,这样就不需要加上 1 了。
3. 可以添加注释,便于代码的理解和阅读。
下面是修改后的代码:
```
#include <stdio.h>
/**
* @brief 求解约瑟夫问题
*
* @param n 总人数
* @param m 数到 m 就出列
* @return int 最后留下的人的编号
*/
int josephus(unsigned int n, unsigned int m)
{
int j = -1;
for (unsigned int i = 2; i <= n; i++)
{
j = (j + m) % i;
}
return j;
}
int main()
{
unsigned int n, m;
scanf("%u%u", &n, &m);
int sum = josephus(n, m);
printf("%d\n", sum + 1); // 输出最后留下的人的编号
return 0;
}
```
相关问题
#include <stdio.h> int josephus(int n, int k) { if (n == 1) return 1; else return (josephus(n - 1, k) + k-1) % n + 1; } int main() { int n = 7, k = 3; // n为总人数,k为报数间隔 printf("The chosen one is %d\n", josephus(n, k)); return 0; }
这是一个经典的约瑟夫问题的解决方案,其中约瑟夫问题是一个著名的数学问题,它的故事可以描述如下:
一群犯人被困在一座监狱里,他们被告知,所有人都必须参与一个游戏,这个游戏的规则是:所有人围成一圈,从某个人开始,每轮从这个人开始顺时针报数,报到第k个人就要出局,直到只剩下一个人为止,这个人将被释放。问这个人应该站在哪个位置,才能保证自己成为最后一个幸存者?
这段代码实现了一个递归函数 `josephus`,它的输入参数有两个:n 表示总人数,k 表示报数间隔。函数的返回值是最后剩下的那个人的编号。
函数中,首先判断如果只有一个人(n==1),那么这个人就是最后的幸存者,直接返回1即可。
否则,递归调用 `josephus(n-1, k)`,表示在 n-1 个人中,每 k 个人出局,最后剩下的人的编号。这个结果加上 k-1,再对 n 取模,再加上 1,就是 n 个人中,每 k 个人出局,最后剩下的人的编号。
在 main 函数中,设置了总人数 n=7,报数间隔 k=3,然后调用 `josephus` 函数求解,最后输出结果。
#include <stdio.h> #include <stdlib.h> #include <math.h> long long fun( long long k ) { long long b; for( b = 0; pow( 2 , b ) < k; b++ ); return b; } int main() { long long n; while( scanf("%lld",&n) != EOF ) { long long m = fun( ++n ); long long c = pow( 2 , m ), g ,f; g = c - n + 1; f = c + 1 - 2 * g; printf("%lld\n",f); } return 0; }主要算法与设计步骤
这个程序用来解决 Josephus 问题,其主要算法和设计步骤如下:
1. 定义函数 fun,用来计算一个数字的二进制位数,其输入为一个 long long 类型的数字 k。fun 函数中使用了一个 for 循环,每次将数字 2 的幂次方与 k 进行比较,直到 2 的幂次方大于或等于 k,此时循环结束,返回幂次方数作为 k 的二进制位数。
2. 在主函数中,使用 while 循环来不断读入输入的数字 n,直到读入到 EOF 为止。每次读入后,调用函数 fun 来计算 n+1 的二进制位数,用变量 m 存储。然后,计算出最小的 2 的幂次方 c,使得 c 大于等于 n+1,用变量 g 存储 c-n+1。最后,通过 f = c + 1 - 2 * g 计算出最后留下的人的编号,并将其输出。
3. 整个程序的设计思路是:将 n+1 转化为二进制位数,然后通过一系列计算得到最后留下的人的编号。具体来说,将 n+1 转化为二进制位数后,在最高位加上 1,得到一个新的数字 c。然后,将 c-n+1 作为起点,每次删除第 g 个数字,直到只剩下最后一个数字,其编号即为 f。
4. 程序中使用了数学公式和函数 pow 来简化计算。
阅读全文