C语言程序设计基础|约瑟夫环
2023-09-27 14:27:30 时间
题目描述:
有n个人围成一个圈,从第一个人开始顺序报号1,2,3。凡是报到3退出圈子中的人原来的序号。要求打印出退出人的序号。以及找出最后留在圈子中的人原来的序号。
输入要求:
输入n
输出要求:
退出人的序号,并找出最后留在圈子里的人原来的序号
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int arr[n], brr[n], count, circal, xin;
count = 0;//用来记报数,从而依次找出报3的倍数的位置
circal = 0;//化圈为直线,一直对n取余,从而不断来回
xin = 0;
for (int i = 0; i < n; i++)
{
arr[i] = i + 1;//编号是从1开始排
}
while (xin < n)//当还退出的人数小于总人数时执行循环
{
if (arr[circal % n] != 0)//如果目前所在的位置不是0就报数,是0就跳过
{
count++;//报数
if (count % 3 == 0)//在圈子中报到3就退出相当于在一排中报到3的倍数就退出
{
brr[xin] = arr[circal % n];//将报到3的倍数位置上的数传递给另一个数组
arr[circal % n] = 0;//原位置清零
xin++;//退出的数+1
}
}
circal++;//圈子不断向后走
}
for (int i = 0; i < n - 1; i++)
{
cout << brr[i] << " ";
}
cout << endl;
cout << brr[n - 1];
return 0;
}
本题的思路就是将圈子化为直线,不断进行排列,从而找到符合条件的数……
如果将3改为任意数,可以依次找到报任意数的位置,代码如下:
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;
int main() {
int n, x;
cin >> n >> x;
int arr[n], brr[n], count, circal, xin;
count = 0;//用来记报数,从而依次找出报3的倍数的位置
circal = 0;//化圈为直线,一直对n取余,从而不断来回
xin = 0;
for (int i = 0; i < n; i++)
{
arr[i] = i + 1;//编号是从1开始排
}
while (xin < n)//当还退出的人数小于总人数时执行循环
{
if (arr[circal % n] != 0)//如果目前所在的位置不是0就报数,是0就跳过
{
count++;//报数
if (count % x == 0)//在圈子中报到x就退出相当于在一排中报到x的倍数就退出
{
brr[xin] = arr[circal % n];//将报到x的倍数位置上的数传递给另一个数组
arr[circal % n] = 0;//原位置清零
xin++;//退出的数+1
}
}
circal++;//圈子不断向后走
}
for (int i = 0; i < n - 1; i++)
{
cout << brr[i] << " ";
}
cout << endl;
cout << brr[n - 1];
return 0;
}
相关文章
- C语言中初始化内存的方法
- C语言基础MessageBox(......)用法详解
- 《51单片机应用开发范例大全(第3版)》——第1章 单片机C语言开发基础
- 《C语言解惑》一导读
- 《21天学通C语言(第7版)》一第1部分 C语言基础 第2课 C程序的组成部分 2.1 简短的C程序
- 《C语言编程——零基础初学者指南(第3版)》一1.4 使用C语言
- 《C语言编程——零基础初学者指南(第3版)》一第2章 编写第一个C程序2.1 概述
- 数据结构-图的实现以及基础算法-C语言实现
- C语言:文件操作(3)
- C语言:动态内存分配(1)
- C语言:分支与循环(2)
- 《数据结构与算法 C语言版》—— 3.3栈与递归实现
- 《C语言解惑》—— 2.8 一维数组更要特殊对待
- Linux共享内存通信的C语言Demo代码
- (第五列)C语言常见基础题型,确定不看一下?:求10000到100000的五位回文数。
- (第四列)C语言常见基础题型,确定不看一下?:递归函数如何使用?
- C语言指针加1问题以及字节对齐问题
- C语言基础语法进阶练习题
- C语言入门基础内容篇—基本数据类型
- C语言基础
- C语言基础 原码 反码 补码 移码简介
- C语言笔试题精选3---死锁发生必要条件是?
- C语言检查本机公网IP并发送邮件
- 1089 狼人杀-简单版 (20 分)C语言
- C语言读写配置文件--转载
- 【C/C++】C语言复制字符串及复制函数汇总(strcpy()/memcpy()/strncpy()/memmove())
- 【C语言】运算符与操作符的用法全面汇总(非常有用)
- C语言标准库