<span style="font-size:18px;color:#009900;">#include<stdio.h>
#include<string.h>
#define maxn 105
char ans[maxn];
int less(int a,int b,int n)
{
for(int i=0; i<n; i++)
{
if(ans[(a+i)%n]>ans[(b+i)%n])return true;
if(ans[(a+i)%n]<ans[(b+i)%n])return false;
}
}
int main()
{
int T,i,a,n;
scanf("%d",&T);
while(T--)
{
scanf("%d\n",&n);
fgets(ans,n+1,stdin);
printf("%c",ans[i]);
putchar('\n');
}
for(a=i=0; i<n; i++)
if(less(a,i,n))a=i;
for(i=0; i<n; i++)
printf("%c",ans[(a+i)%n]);
putchar('\n');
return 0;
}
</span>
上面是自己寫的代碼,下面是書上的代碼;
<span style="font-size:18px;color:#009900;">#include<stdio.h>
#include<string.h>
#define maxn 105
//環狀串s的表示法p是否比表示法q的字典序小
int less(const char*s,int p,int q){
int n = strlen(s);
for(int i=0;i<n;i++)
if(s[(p+i)%n]!=s[(q+i)%n]) //條件判斷更簡潔,取模實現環狀
return s[(p+i)%n]<s[(q+i)%n];
return 0; //相等
}
int main()
{
int T;
char s[maxn];
scanf("%d",&T);
while(T--){
scanf("%s",s);
int ans = 0;
int n = strlen(s);
for(int i = 1;i<n;i++)
if(less(s,i,ans))ans=i; //刪繁就簡,循環進行兩兩比較
for(int i=0;i<n;i++)
putchar(s[(i+ans)%n]);
putchar('\n');
}
return 0;
}</span>