#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; }主要算法与设计步骤
时间: 2024-03-08 08:45:05 浏览: 71
这个程序用来解决 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 来简化计算。
相关问题
#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; }时间复杂度与空间复杂度分析
时间复杂度分析:
1. 函数fun的时间复杂度为 O(log n),其中n为输入的数字。
2. 主函数中,除了调用函数fun,还包括了一些基本的算术运算和输入输出操作,它们的时间复杂度可以忽略不计。
3. 因此,整个程序的时间复杂度为 O(log n)。
空间复杂度分析:
1. 函数fun中只定义了一个变量b,空间复杂度为 O(1)。
2. 主函数中除了调用函数fun外,只定义了4个变量,空间复杂度也为 O(1)。
3. 因此,整个程序的空间复杂度为 O(1)。
综上,该程序的时间复杂度为 O(log n),空间复杂度为 O(1)。
阅读全文