所以我有这个功课来移动给定单词中的字母。在第一行我必须输入一个字符串(包含拉丁字母表中的n个字母),在第二行我必须输入一行m个整数k - 程序必须执行的移位计数。输入可以有N个例子。
约束:
0< n<百万
0< m<百万
-1< k<百万
0< N< 100
输入示例:
胡言乱语
4 1 0
Floccinaucinihilipilification
10 20
上面示例的输出:
cadabraabra
bracadabraa
胡言乱语
inihilipilificationFloccinauc
ificationFloccinaucinihilipil
现在,这是我编写的代码,它应该正常工作,但它没有^^:
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
string m;
void reverse(unsigned a, unsigned b)
{
unsigned i, j, k, c;
char tmp;
for (c=(b-a)/2, k=a, j=b, i=0; i<c; i++, j--, k++)
{
tmp = m[k];
m[k] = m[j];
m[j] = tmp;
}
}
void shift(unsigned k, int n)
{
reverse(0, k-1);
reverse(k, n-1);
reverse(0, n-1);
}
int main()
{
int N;
while(getline(cin, m))
{
int n = m.length();
if (n <= 0 || n >= 1000000)
{
break;
}
string strnumbers;
cin>>strnumbers;
int buffer;
vector<int> numbers;
istringstream iss(strnumbers);
while (iss >> buffer ) numbers.push_back(buffer);
if(numbers.size() >= 1000000)
{
break;
}
vector<char> result;
for(vector<int>::size_type s = 0; s < numbers.size(); s++)
{
if(numbers[s] < -1 || numbers[s] > 1000000)
{
break;
}
shift(numbers[s], n);
for (int i=0; i<n; i++) result.push_back(m[i]);
}
for(vector<char>::size_type s = 0; s != result.size(); s++)
{
cout<<result[s];
}
N++;
if (N == 100)
{
break;
}
}
return 0;
}
首先,它不会打印所有答案。如果我使用第一个例子(abracadabra 4 1 0)它只输出第一行,这是第二个问题。它输出“cadabraarba”而不是输出“cadabraabra”。我做错了什么,有什么方法可以解决这个问题吗?感谢您的帮助:)
答案 0 :(得分:1)
有什么方法可以解决这个问题吗? ?
当然,不要重新发明轮子,请使用std::rotate
std::string str;
while (std::getline(std::cin, str))
{
int number;
while (std::cin >> number)
{
std::string tmp{str};
std::rotate(tmp.begin(), tmp.begin() + number, tmp.end());
std::cout << tmp << "\n";
}
}
答案 1 :(得分:0)
#include <iostream>
#include <string>
using namespace std;
string shift(const string & in,int s)
{
int length=in.size();
int rotate=s%length;
string result;
if(rotate == 0)
{
result=in;
}
else
{
result=in.substr(rotate)+in.substr(0,rotate);
}
return result;
}
int main ()
{
std::string a="abcdefghi";
std::cout<<shift(a,1)<<std::endl;
return 0;
}