POJ 1107 W's Cipher (模拟解密)

这是一道简单的模拟题,不过看题的时间长了点,没办法,英语不太好。

题意:

        先是将字母和下划线分为三类a~i,j~r,s~z和‘_’;  然后,独立地交换每组的字母,例如:对于 “_icuo_bfnwhoq_kxert”,

   第一组符号有{i,c,b,f,h,e},位置分别为{2,3,7,8,11,17},假设k1=2;那么第一组符号顺序变为{h,e,i,c,b,f},不过在原字符串中占

       有的位置还是{2,3,7,8,11,17},然后第二组······第三组······

参考代码:

#include<stdio.h>
#include<string.h>
int main()
{
    short k1,k2,k3,a[81],b[81],i,l,n,t;
    char ch[81],cha[81];
    scanf("%d%d%d",&k1,&k2,&k3);
    while(k1||k2||k3)
    {
      scanf("%s",ch);
        l=strlen(ch);
          n=0;
          for (i=0;i<l;i++)
             if (ch[i]>='a'&&ch[i]<='i')
               { 
                 a[n]=i;
                 n++;
               }
               for (i=0;i<n;i++)
               {
                    t=(i+k1)%n;
                    b[t]=a[i];
               }  
               for (i=0;i<n;i++) cha[a[i]]=ch[b[i]];
          n=0;
          for (i=0;i<l;i++)
             if (ch[i]>='j'&&ch[i]<='r')
               { 
                 a[n]=i;
                 n++;
               }
              for (i=0;i<n;i++) 
              {
                  t=(i+k2)%n;
                  b[t]=a[i]; 
              } 
              for (i=0;i<n;i++) cha[a[i]]=ch[b[i]]; 
              //for (i=0;i<n;i++) printf("%d ",a[i]);printf("\n");
              //  for (i=0;i<n;i++) printf("%d ",b[i]);printf("\n");
          n=0;     
          for (i=0;i<l;i++)
              if ((ch[i]>='s'&&ch[i]<='z')||ch[i]=='_')
               { 
                 a[n]=i;
                 n++;
               }
               for (i=0;i<n;i++) 
               {
                   t=(i+k3)%n;
                   b[t]=a[i];
               }  
               for (i=0;i<n;i++) cha[a[i]]=ch[b[i]];        
        for (i=0;i<l;i++) printf("%c",cha[i]);
          printf("\n");
       scanf("%d%d%d",&k1,&k2,&k3);
    }
  return 0;
}     



你可能感兴趣的:(C++,解密)