1. 程式人生 > >檔案操作版約瑟夫環類問題

檔案操作版約瑟夫環類問題

題目描述:

本題目儲存的原始檔名應為: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;
}