10
4 5 3 7 2 8 1 6 10 9
1 Hello Bob
1995 CERC
0(n)
0(k)
4 5 3 7 2 8 1 6 10 9
1 Hello Bob
1995 CERC
0(n)
0(k)
n
1-n(不重复,无序排列)
k(执行次数) 字符串(注意字符串开头可以为空,这里不能用scanf()来读入字符串)
#include<stdio.h>
#include<string.h>
int cipher(int k_key[200],int i,int k) //肯能会产生循环,为了节省时间,寻找最小周期;并且找出第i个字符会落在数组key中的某位
{
int j,t=i+1;
i++;
for(j=1;j<=k;j++)
{
i=k_key[i-1];
if(i==t)
{
for(i=t,t=0;t<(k%j);t++) //利用最小周期
i=k_key[i-1];
return i;
}
}
return i;
}
int main()
{
int n,k,key[200],len,i;
char temp[201],str[201];
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(i=0;i<n;i++)
scanf("%d",&key[i]);
while(scanf("%d",&k)!=EOF&&k!=0)
{
getchar();
gets(temp);
len=strlen(temp);
if(len<n)
for(i=len;i<n;i++)
temp[i]=' ';
for(i=0;i<n;i++)
str[cipher(key,i,k)-1]=temp[i]; //从以上函数找出的i,确定字符数组str[i(自定义函数中的i)-1]为原先输入函数中对应的temp[i(主函数中的i)]
for(i=n-1;;i--)
if(str[i]!=' ')
{
str[i+1]='\0';
break;
}
printf("%s\n",str);
}
printf("\n");
}
return 0;
}