可以通过找规律发现,当m=1时,f(n,m)=n;当m>1时,有以下非递推规律: 当 n < m 时, f(n,m) = [f(n-1,m) + m] % n 当 n >= m 时,f(n,m) = f(n - n/m, m) - (n % m) 其中,[x]表示向下取整函数。 这个规律的时间复杂度为O(1),空间复杂度为O(1)。 将此规律转化为c语言或者c++代码
时间: 2024-03-11 11:47:51 浏览: 13
好的,以下是 C++ 代码实现:
```cpp
#include <iostream>
using namespace std;
int josephus(int n, int m) {
int ans = 0;
for (int i = 2; i <= n; ++i) {
ans = (ans + m) % i;
}
return ans + 1;
}
int main() {
int n, m;
cin >> n >> m;
cout << josephus(n, m) << endl;
return 0;
}
```
以上代码实现了非递归规律的方式,时间复杂度为 O(n),空间复杂度为 O(1)。
相关问题
功能:编写函数求表达式的和(n的值由主函数输入)。 1-1/2+1/3-1/4+......+1/m 例如:当n=20时,表达式的值为0.668771。 C语音
以下是求表达式和的 C 语言代码:
```
#include <stdio.h>
double expression_sum(int n) {
double sum = 0.0;
int sign = 1;
for (int i = 1; i <= n; i++) {
sum += sign * 1.0 / i;
sign *= -1;
}
return sum;
}
int main() {
int n;
printf("请输入n的值:");
scanf("%d", &n);
printf("表达式的和为:%f\n", expression_sum(n));
return 0;
}
```
程序中,`expression_sum` 函数用于求表达式的和,`n` 为表达式中的最大分母,`sum` 为累加器,`sign` 用于记录每一项的正负号。函数中使用了 `for` 循环遍历从 1 到 `n` 的所有分母,按照规律计算每一项的值,并将其加入 `sum` 中。最终返回 `sum`,即表达式的和。
在 `main` 函数中,先读入 `n` 的值,然后调用 `expression_sum` 函数计算表达式的和,并输出结果。
答题计时 64:08:14 答题卡 (1/1) 1.主观题 (100分) 答案保存成功 实验3 顺序程序设计 一、实验目的 1、掌握C语言中使用最多的一种语句——赋值语句的使用方法。 2、掌握各种类型数据的输入输出方法,能正确使用各种格式字符。 3、进一步掌握编写程序和调试程序的方法。 二、实验内容及要求 1、输入下列程序,通过该程序掌握各种格式转换符的正确使用方法。 #include<stdio.h> int main() {int a,b; float d,e; char c1,c2; double f,g; long m,n; unsigned int p,q; a=61;b=62; c1=’a’;c2=’b’; d=3.56;e=-6.87; f=3157.890121;g=0.123456789; m=50000;n=-60000; p=32768;q=40000; printf(“a=%d,b=%d\nc1=%c,c2=%c\nd=%6.2f,e=%6.2f\n”,a,b,c1,c2,d,e); printf(“f=%15.6f,g=%15.12f\nm=%ld,n=%ld\np=%u,q=%u\n”,f,g,m,n,p,q); return 0; } (1)运行此程序并分析结果。 (2)在此基础上,将程序第10-14行改为 c1=a;c2=b; f=3157.890121;g=0.123456789; d=f;e=g; p=a=m=50000;q=b=n=-60000; 运行程序,分析结果。 2、用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1='A',c2='a'。在键盘上应该如何输入? #include<stdio.h> int main() { int a,b; float x,y; char c1,c2; scanf("a=%db=%d",&a,&b); scanf("%f%e",&x,&y); scanf("%c%c",&c1,&c2); printf("a=%d,b=%d,x=%f,y%f,c1=%c,c2=%c",a,b,x,y,c1,c2); return 0; } 运行时分别按以下方式输入数据,观察输出结果,分析原因。 (1)a=3,b=7,x=8.5,y=71.82,A,a (2)a=3 b=7 x=8.5 y=71.82 A a (3)a=3 b=7 8.5 71.82 A a (4)a=3 b=7 8.5 71.82Aa (5)3 7 8.5 71.82Aa (6)a=3 b=7 8.5 71.82 A a (7)a=3 b=7 8.5 71.82 Aa (8)a=3b=7 8.5 71.82Aa 通过本题,总结输入数据的规律和容易出错的地方。
答题计时为64小时8分钟14秒,答题卡共有1个问题,为主观题,分值为100分,答案已保存成功。实验3的内容为顺序程序设计,实验目的为掌握C语言中赋值语句的使用方法、各种数据类型的输入输出方法和编写调试程序的方法。实验要求包括输入指定程序,掌握各种格式转换符的正确使用方法。