这道题主要是计算下标需要注意,这点上合循环队列很相似,(i+k1)%length求出相对位置。 // W's Cipher.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> #include<fstream> #include<string> #include<vector> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { ifstream cin("d://1.txt"); int k1,k2,k3; char res[100]; int i,j; string s; int pos; vector<int>v1,v2,v3; while(cin>>k1>>k2>>k3){ if(k1==0&&k2==0&&k3==0) break; cin>>s; v1.clear(); v2.clear(); v3.clear(); for(i=0;i!=s.size();i++){ if(s[i]>='a'&&s[i]<='i') v1.push_back(i); else if(s[i]>='j'&&s[i]<='r') v2.push_back(i); else v3.push_back(i); } for(i=0;i!=v1.size();i++){ pos=(i+k1)%v1.size(); res[v1[pos]]=s[v1[i]]; } for(i=0;i!=v2.size();i++){ pos=(i+k2)%v2.size(); res[v2[pos]]=s[v2[i]]; } for(i=0;i!=v3.size();i++){ pos=(i+k3)%v3.size(); res[v3[pos]]=s[v3[i]]; } res[s.length()]=0; cout<<res<<endl; } system("pause"); return 0; }