code.club

 找回密碼
 立即註冊
搜索
查看: 7777|回復: 1
打印 上一主題 下一主題

環狀序列

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2015-10-28 23:07:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 enter 於 2015-11-2 15:19 編輯

輸入一個字串,依序從前面位置排頭輸出所有組合。

如輸入 12345 則有如下輸出:12345
23451
34512
45123
51234

#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
        int n,x,y,z;
        string dna,temp1,temp2;//使用string比較方便,用字串陣列char[]會面臨scanf()輸入出錯的問題
       
        cin>>dna;
        n=dna.length();//求出字串的長度
       
        temp1=dna; //可以直接賦值給另string
       
        for(x=0;x<n;x++)
        {
                z=x;//每次循環前都用變數z來取代x
                for(y=0;y<n;y++)
                        {   
                                if(z==n) z=0;//如果z到達字串尾則回到最前面的0
                                temp2[y]=temp1[z++];//temp2字串從頭開始取得temp1自某序列之後的字符
               
                        }
            //字串型態一旦是使用陣列方式取得內容,就再不能直接cout方式一次印出,而且它們屬於string型態,puts()也不適用
                for(y=0;y<n;y++)
                cout<<temp2[y];
                cout<<endl;
               
        }
       
               
        return 0;
}
       
回復

使用道具 舉報

沙發
 樓主| 發表於 2015-10-29 15:22:46 | 只看該作者
本帖最後由 enter 於 2015-10-29 15:35 編輯

本版本是要求出最小的環狀序列:

#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
        int n,x,y,z,j,k;
        string dna,temp1,temp2,less;//使用string比較方便,用字串陣列char[]會面臨scanf()輸入出錯的問題
       
        cin>>dna;
        n=dna.length();//求出字串的長度
       
        temp1=dna;
        less=dna;//先將less設成dna的排序
        for(x=0;x<n;x++)
        {
                z=x;//每次循環前都用變數z來取代x
                for(y=0;y<n;y++)
                        {   
                                if(z==n) z=0;//如果z到達字串尾則回到最前面的0
                                temp2[y]=temp1[z++];//temp2字串從頭開始取得temp1自某序列之後的字符
               
                        }
            
                                //開始拿less和temp的字符比大小
                                for(j=0;j<n;j++) {
                                if(less[j]==temp2[j]) continue;//一旦等於,跳下一個字元比較
                                if(less[j]<temp2[j]) break;//一旦比temp2小就不用再比,直接斷開跳下次循環
                                //字串型態一旦是使用陣列方式取得內容,就再不能直接cin方式一次印出,而且它們屬於string型態,puts()也不適用                               
                                if(less[j]>temp2[j]) //一旦temp2比較小,則將temp2陣列複製給less,然後斷開跳至下個循環
                                for(k=0;k<n;k++) less[k]=temp2[k];break;
                        }
               
        }
        //字串型態一旦是使用陣列方式取得內容,就再不能直接cin方式一次印出,而且它們屬於string型態,puts()也不適用
    //最後的less即是最小的環狀序列
    for(k=0;k<n;k++)
        cout<<less[k];
               
        return 0;
}
       
       
回復 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|手機版|Archiver|code.club  

GMT+8, 2024-12-4 16:05 , Processed in 0.082249 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表