您的位置:首页 > 其它

第2章练习题--10--密码--2818

2011-10-31 10:11 381 查看
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main(int argc, char *argv[])
{
int n,k,plain[202],times[202],count,tmp;
int i,j;
char capher[202],plainText[202],temp[204];
//不加这个会出错
for(i=0;i<202;i++)
{
plainText[i]=32;
}
while(scanf("%d",&n)&&n!=0)
{
for(i=0;i<n;i++)
scanf("%d",&plain[i]);
//计算加密到原位置的次数
for(i=0;i<n;i++)
{
tmp=i;
count=0;
do
{
tmp = plain[tmp]-1;
count++;
}while(tmp!=i);
times[i]=count;
}

while(scanf("%d",&k)&&k!=0)
{
getchar();
gets(capher);

//将capher补充到n的长度
if(strlen(capher)<n)
{
for(i=strlen(capher);i<n;i++)
capher[i]=32;
capher[i]='\0';
}

for(i=0;i<n;i++)
{
count = k%times[i];
tmp = i;
while(count--)
{
tmp=plain[tmp]-1;
}
plainText[tmp]=capher[i];
}
plainText
='\0';
printf("%s\n",plainText);
}
printf("\n");
}

system("PAUSE");
return 0;
}
TLE错误:超时,要用简洁的算法,逐个字符考虑变换位置,总有回到原来位置的时候。还要注意的一个问题是变换次数要计算对。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: