还记得上学时每周要换座位吗?第四组换到第一组、第一组换到第二组……
现在用一个字母表示一个组,请你计算经历n周之后座位的情况。
输入有多组数据,每组数据一行。
每行包括一个字符串s和整数n
1. s只有相互不同的字母构成。
2. 如果n是正整数,字符串向右移动;否则向左移动。
对应每一组输入,输出调整之后的座位情况。
ABCD 2 ABCD -1
CDAB BCDA
//约瑟夫问题 #include<iostream> (720)#include<string> #include<algorithm> using namespace std; int main(){ string s; long long n; while(cin>>s>>n){ string res=s; if(n>0){///右移n位,相当于左移s.size()-n位 n%=s.size(); for(int i=0;i<s.size();i++){ res[i]=s[(i+s.size()-n)%s.size()]; } }else if(n<0){ n=-n; for(int i=0;i<s.size();i++){ res[i]=s[(i+n)%s.size()]; } } cout<<res<<endl; } return 0; }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner scanner=new Scanner(System.in); while(scanner.hasNext()){ String str=scanner.next(); int n=scanner.nextInt(); n%=str.length(); str+=str; if(n>0) n=str.length()/2-n; else n=Math.abs(n); System.out.println(str.substring(n,n+str.length()/2)); } } }
把输入取余数并变成向右移(左移k等价右移n-k),再取子串拼合即可。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(int argc, char** argv)
{
//freopen("in.txt", "r", stdin);
string s;
int k;
while (cin >> s >> k)
{
int n = s.size();
k = (n + k % n) % n;
cout << s.substr(n - k) + s.substr(0, n - k) << endl;
}
return 0;
}
#include <iostream> #include <string> using namespace std; int main() { string str; long long n; while (cin >> str >> n) { n = n % str.length(); if (n < 0) n += str.length(); string temp = str.substr(str.length() - n, n) + str.substr(0, str.length() - n); //sub1 = string(str.begin() + str.length() -n, str.end()); //sub2 = string(str.begin(), str.begin() + str.length() - n); cout << temp << endl; } return 0; }
#include <iostream> #include <string> using namespace std; int main() { string str; long long n; while (cin >> str >> n) { long long len = str.length(); n = n % len; if (n < 0) n += len; string temp = str.substr(len - n, n) + str.substr(0, len - n); //sub1 = string(str.begin() + str.length() -n, str.end()); //sub2 = string(str.begin(), str.begin() + str.length() - n); cout << temp << endl; } return 0; }
#include<cstdio> (802)#include<cstring> #include<algorithm> using namespace std; char str[100010]; void reverse(char str[],int l,int r){ int k=0; for(int i=l;i<=(l+r)/2;++i){ swap(str[i],str[r-k]); k++; } //printf("%s\n",str); } int main(){ int n; while(scanf("%s",str)!=EOF){ scanf("%d",&n); int len=strlen(str); if(len==1){ printf("%s\n",str); continue; } if(n<0){ if(n%len==0) n=0; else n=n%len+len; }else{ n=n%len; } reverse(str,0,len-n-1); reverse(str,len-n,len-1); reverse(str,0,len-1); printf("%s\n",str); } return 0; }
#include <iostream> #include <string> using namespace std; int main() { int n; string s; while(cin>>s>>n) { string tmp=s+s; int length=s.size(); int k=n%length; if(k<0) k=abs(k); else if(k>0) k=length-k; string res=tmp.substr(k,length); cout<<res<<endl; } return 0; }
#include<iostream> #include<string> using namespace std; int main() { string str; int cnt; long long num; while (cin >> str >> num) { if (num > 0) { cnt = num % str.length(); for (int i = str.length() - cnt; i < str.length(); i++) cout << str[i]; for (int i = 0; i < str.length() - cnt; i++) cout << str[i]; cout << endl; } else if (num < 0) { cnt = (-num) % str.length(); for (int i = cnt; i < str.length(); i++) cout << str[i]; for (int i = 0; i < cnt; i++) cout << str[i]; cout << endl; } else cout << str << endl; } return 0; }
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { String s = sc.next(); int n = sc.nextInt() % s.length(); if(n == 0) System.out.println(s); else if(n > 0) System.out.println(s.substring(s.length() - n) + s.substring(0, s.length() - n)); else System.out.println(s.substring( - n) + s.substring(0, - n)); } } }