文件操作版约瑟夫环类问题

题目描述:

本题目保存的源文件名应为:prog03.cpp 或 prog03.c 或 prog03.py (按使用编程工具确定),该文件应该保存在你的学号文件夹中用于提交。

n 个人围成一圈,从第一个人开始顺序编号为1到n。从第1个人从1开始报数,数到3的人出圈。再由下一个人从1开始报数,数到3的人出圈,如此循环数下去,直到最后一个人出圈。编写程序实现,n的值程序从 in03.txt中读取,请将出圈人的编号按出圈顺序写入 out03.txt 中,输出的编号用英文逗号分割。

例如,n为8,则 out3.txt中输出的数据应该为:3,6,1,5,2,8,4,7 。

特别注意:请在你使用的计算机 D: 盘建立一个以你学号为名的文件夹,将考试提供的“程序设计输入文件”文件夹中的文件都拷贝至该文件夹备用。最后提交时,将你的学号文件夹中的所有内容打包为一个以你学号命名的压缩文件(.rar)格式,然后提交该文件。所有程序代码均需用注释说明求解原理或思路。

解题思路:这个题说白了就是简化了的约瑟夫环类问题,文件提交形式的考试不会出现TLE,于是我用的递归法。

我的代码:

#include <bits/stdc++.h>
using namespace std;
//约瑟夫环问题
int Joseph(int sum,int count,int n)
{
    if(n==1)
    {
        return (sum+count-1)%sum;
    }
    else
    {
        return (Joseph(sum-1,count,n-1)+count)%sum;
    }
}

int main()
{
    ifstream txtfile;   //建立输入文件流对象
    txtfile.open("d:\\代码\\20171101231\\in03.txt");
    fstream myfile;    //建立文件流
    myfile.open("d:\\代码\\20171101231\\out03.txt",ios::out|ios::trunc);
    //打开目标文件,ios::out表示写入文件操作,ios::trunc当文件存在时,清空文件内容
    int sum=0,count=3,alive=1; //数到3出圈,所以count=3,存活人数为1
    //读入总人数
    txtfile >> sum;
    // 约瑟夫环递归解法
    bool flag = true;   //为了输出格式而立的flag
    for(int i=1;i<=sum;i++)
    {
        if(flag)
        {
            myfile << Joseph(sum,count,i)+1;
            flag = false;
        }
        else
        {
            myfile << "," << Joseph(sum,count,i)+1;
        }

    }
    txtfile.close();  //拉完shi要记得擦PP
    myfile.close();   
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42449444/article/details/84726505