圈子移动给定单词中的字母

时间:2016-12-13 11:39:00

标签: c++

所以我有这个功课来移动给定单词中的字母。在第一行我必须输入一个字符串(包含拉丁字母表中的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”。我做错了什么,有什么方法可以解决这个问题吗?感谢您的帮助:)

2 个答案:

答案 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";
    }
}

Live at coliru

答案 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;
}