code.club
標題:
環狀序列
[打印本頁]
作者:
enter
時間:
2015-10-28 23:07
標題:
環狀序列
本帖最後由 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;
}
作者:
enter
時間:
2015-10-29 15:22
本帖最後由 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;
}
歡迎光臨 code.club (https://code.club/)
Powered by Discuz! X3.2