#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<string.h> #include<ctype.h> int main() { int n; int a[6002] = { 0 }; scanf("%d", &n); int sum = n; int flag = 0; int blag = 0; int count = 0; for (int i = 1; i <= n; i++) { a[i] = 1; } int j = 3, k = 2; for(sum=n;sum > 3;) { if (flag == 0) { for (int i = 1; i <= n; i++) { count++; if (count % 3 == 0) { if (a[i] == 2) { count--; } else { a[i] = 2; sum--; count = 0; } } } flag = 1; } if (flag == 1) { for (int i = 1; i <= n; i++) { count++; if (count % 2 == 0) { if (a[i] == 2) { count--; } else { a[i] == 2; sum--; count = 0; } } } flag = 0; } } for (int i = 1; i <= n; i++) { if (a[i] != 0 && a[i] != 2) { if (blag == 0) { printf("%d", i); blag = 1; } else printf(" %d", i); } } return 0; }这个代码咋修改
时间: 2023-12-01 19:04:54 浏览: 81
如何使用_CRT_SECURE_NO_WARNINGS
5星 · 资源好评率100%
这段代码是一个求解约瑟夫问题的算法,但是存在一些问题:
1.第一个循环不必从1循环到n,只需要从1循环到6002即可,因为数组a的大小为6002。
2.第二个循环中的变量j和k没有使用,可以删除。
3.第一个循环中将a数组全部初始化为1,但是这里的1和后面的2没有任何区别,应该将a数组初始化为i,表示第i个人还在游戏中。
4.第二个循环中有一个错误,将a[i] == 2改为a[i] = 2。
5.最后的输出中,变量blag没有必要,可以直接在判断是否为第一个数时使用一个标志位即可。
下面是修改后的代码:
```c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
int n;
int a[6002] = { 0 };
scanf("%d", &n);
int sum = n;
int flag = 0;
int count = 0;
for (int i = 1; i <= n; i++)
{
a[i] = i;
}
for (sum = n; sum > 3;)
{
if (flag == 0)
{
for (int i = 1; i <= n; i++)
{
count++;
if (count % 3 == 0)
{
if (a[i] == 2)
{
count--;
}
else
{
a[i] = 2;
sum--;
count = 0;
}
}
}
flag = 1;
}
if (flag == 1)
{
for (int i = 1; i <= n; i++)
{
count++;
if (count % 2 == 0)
{
if (a[i] == 2)
{
count--;
}
else
{
a[i] = 2;
sum--;
count = 0;
}
}
}
flag = 0;
}
}
int first = 1;
for (int i = 1; i <= n; i++)
{
if (a[i] != 0 && a[i] != 2)
{
if (first)
{
printf("%d", i);
first = 0;
}
else
printf(" %d", i);
}
}
return 0;
}
```
阅读全文