Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回所有代码-字符串_C++_Recursion - Fatal编程技术网

C++ 返回所有代码-字符串

C++ 返回所有代码-字符串,c++,recursion,C++,Recursion,假设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'; retu

假设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;
}
#包括
#包括
使用名称空间std;
使用名称空间std;
int atoi(字符a)
{
int i=a-'0';
返回i;
}
char itoa(国际一级)
{
字符c='a'+i-1;
返回c;
}
int getcode(字符串输入,字符串输出[10000]){
if(input.size()==0)
{
返回1;
}
if(input.size()==1)
{
输出[0]=输出[0]+itoa(atoi(输入[0]);
返回1;
}
字符串result1[10000],result2[10000];
国际尺寸2;
int size1=getcode(input.substr(1),result1);
if(input.size()>1)
{

如果(atoi(input[0])*10+atoi(input[1])>10&&atoi(input[0])*10+atoi(input[1])您可以通过以下方式更简单地实现:

#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;
}

我得到了它,我没有将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;
}
intgetcode(字符串输入,字符串输出[10000]){
if(input.size()==0)
{
输出[0]=“”;
返回1;
}
if(input.size()==1)
{
输出[0]=itoa(atoi(输入[0]);
返回1;
}
字符串result1[10000],result2[10000];
int size2=0;
int size1=getcode(input.substr(1),result1);
if(input.size()>1)
{

如果(atoi(input[0])*10+atoi(input[1])>=10&&atoi(input[0])*10+atoi(input[1]),我的建议是将IDE与Visual Studio这样的调试器一起使用,这样您就可以一次一行地遍历代码,在每一步查看变量,以确定代码偏离预期的位置。
string output[10000]
我不明白你为什么想要一个一万个字符串的数组。我也不明白你试图解决的问题。好的,看。例如,我给你一个输入1123。所以你必须编写一个代码,这样打印出来的最终输出是“aabc alc aaw kbc kw”@priyans试图实现的是将数字分组成小于26的数字,并将这些分组转换成字母,这样在12345中就有了{1,2,3,4,5}、{12,3,4,5}和{1,23,4,5},当用字母替换时,就会得到字符串“abcde”、“awde”和“lcde”。希望这有帮助,因为我现在没有时间分析它。也不要在堆栈上分配10000个字符串-改用std::vector。我得到了它的同事。我没有将size2变量初始化为零。我也没有使用>=运算符。@jdehesa的代码比这要好得多。
c++
代码。我的建议是研究cod是的,我同意@jdehesa编写的代码比我好得多:),但我觉得有必要让别人知道我犯了什么错误:)。