C++ 返回所有代码-字符串
假设a=1,b=2,c=3,z=26。您将获得一个数字字符串S。编写一个程序,返回可以从给定字符串生成的所有可能代码的列表 在大多数情况下,该代码可以工作,但对于数字大于26的输入,它会给出错误的输出。例如:12345C++ 返回所有代码-字符串,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
#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编写的代码比我好得多:),但我觉得有必要让别人知道我犯了什么错误:)。