Вернуть все коды - Строка - PullRequest
1 голос
/ 11 июля 2019

Предположим, что значение a = 1, b = 2, c = 3, ..., z = 26. Вам задана числовая строка S. Напишите программу, которая выдаст список всех возможных кодов, которые могут бытьгенерируется из заданной строки.

В большинстве случаев этот код работает, но он выдает неправильный вывод для входных данных, число которых больше 26. Например: 12345.

#include <iostream>
#include <string.h>
using namespace std;


using namespace std;
int atoi(char a)
{
    int i=a-'0';
    return i;
}
char itoa(int i)
{
    char c='a'+i-1;
    return c;
}
int getCodes(string input, string output[10000]) {
   if(input.size()==0)
   {
       return 1;
   }
    if(input.size()==1)
    {
        output[0]=output[0]+itoa(atoi(input[0]));
        return 1;
    }
    string result1[10000],result2[10000];
    int size2;

    int size1=getCodes(input.substr(1),result1);
    if(input.size()>1)
    {
        if(atoi(input[0])*10+atoi(input[1])>10&&atoi(input[0])*10+atoi(input[1])<27)
        {
            size2=getCodes(input.substr(2),result2);
        }

    }
    for(int i=0;i<size1;i++)
    {
        output[i]=itoa(atoi(input[0]))+result1[i];
    }
    for(int i=0;i<size2;i++)
    {
        output[i+size1]=itoa(atoi(input[0])*10+atoi(input[1]))+result2[i];
    }
    return size1+size2;
}



int main(){
    string input;
    cin >> input;

    string output[10000];
    int count = getCodes(input, output);
    for(int i = 0; i < count && i < 10000; i++)
        cout << output[i] << endl;
    return 0;
}

, если явведите 12345, вывод: "abcde awde lcde l" вместо: "abcde awde lcde"

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Вы можете сделать это проще с помощью чего-то подобного:

#include <utility>
#include <string>
#include <vector>
#include <iostream>

using namespace std;

void getCodesRec(unsigned int num, string& current, vector<string>& result)
{
    // First and last chars for the codes
    static constexpr char FIRST_CHAR = 'a';
    static constexpr char LAST_CHAR = 'z';
    if (num == 0)
    {
        // When there is no more number add the code to the results
        result.push_back(current);
    }
    else
    {
        // Add chars to the existing code
        unsigned int next = num;
        unsigned int rem = next % 10;
        unsigned int f = 1;
        // While we have not gone over the max char number
        // (in practice this loop will run twice at most for a-z letters)
        while (next > 0 && rem <= (unsigned int)(LAST_CHAR - FIRST_CHAR) + 1)
        {
            next = next / 10;
            if (rem != 0)  // 0 does not have a replacement
            {
                // Add the corresponding char
                current.insert(0, 1, FIRST_CHAR + char(rem - 1));
                // Recursive call
                getCodesRec(next, current, result);
                // Remove the char
                current.erase(0, 1);
            }
            // Add another number
            f *= 10;
            rem += f * (next % 10);
        }
    }
}

vector<string> getCodes(unsigned int num)
{
    vector<string> result;
    string current;
    getCodesRec(num, current, result);
    return result;
}


int main()
{
    unsigned int num = 12345;
    vector<string> codes = getCodes(12345);
    cout << "Codes for " << num << endl;
    for (string& code : codes)
    {
        cout << "* " << code << endl;
    }
    return 0;
}

Вывод:

Codes for 12345
* abcde
* lcde
* awde
0 голосов
/ 11 июля 2019

Я понял, товарищи.я не инициализировал переменную size2 в ноль.также я не использовал оператор> =.

int getCodes(string input, string output[10000]) {
   if(input.size()==0)
   {
       output[0]="";
       return 1;
   }
    if(input.size()==1)
    {
        output[0]=itoa(atoi(input[0]));
        return 1;
    }
    string result1[10000],result2[10000];
    int size2=0;

    int size1=getCodes(input.substr(1),result1);
    if(input.size()>1)
    {
        if(atoi(input[0])*10+atoi(input[1])>=10&&atoi(input[0])*10+atoi(input[1])<27)
        {
            size2=getCodes(input.substr(2),result2);
        }

    }
    int k=0;
    for(int i=0;i<size1;i++)
    {
            output[k++]=itoa(atoi(input[0]))+result1[i];
    }
    for(int i=0;i<size2;i++)
    {
            output[k++]=itoa(atoi(input[0])*10+atoi(input[1]))+result2[i];
    }
    return k;
}

это окончательный код функции getCodes.Спасибо всем:)

...