所以我们说以下情况:对于“ 12323465723”,可能的答案是“ abcbcdfegbc”(1 2 3 2 3 4 6 5 7 2 3),“ awwdfegw”(1 23 23 4 6 5 7 23) ,“ lcwdefgw”(12 3 23 4 6 5 7 23),在这种情况下,用户将输入1到26之间的数字,不除以任何空格,程序本身将建议3种解释数字的方法,以获取最大的收益从1到26的组合中,这是从a到z的值
正如您所见,这是问题的最后部分,对此您进行了编辑,谢谢所有到目前为止为我提供帮助的人,我已经设法解决了一半的问题,只剩下上述问题了。
解决->谢谢
答案 0 :(得分:3)
这涉及每个步骤0到2个结果之间的决定。基本情况是没有更多的字符或不能使用它们。在后一种情况下,我们回溯以输出整个树。我们将word
像dynamic programming一样存储在内存中。这自然会导致递归算法。
#include <stdlib.h> /* EXIT */
#include <stdio.h> /* (f)printf */
#include <errno.h> /* errno */
#include <string.h> /* strlen */
static char word[2000];
static size_t count;
static void recurse(const char *const str) {
/* Base case when it hits the end of the string. */
if(*str == '\0') { printf("%.*s\n", (int)count, word); return; }
/* Bad input. */
if(*str < '0' || *str > '9') { errno = ERANGE; return; }
/* Zero is not a valid start; backtrack without output. */
if(*str == '0') return;
/* Recurse with one digit. */
word[count++] = *str - '0' + 'a' - 1;
recurse(str + 1);
count--;
/* Maybe recurse with two digits. */
if((*str != '1' && *str != '2')
|| (*str == '1' && (str[1] < '0' || str[1] > '9'))
|| (*str == '2' && (str[1] < '0' || str[1] > '6'))) return;
word[count++] = (str[0] - '0') * 10 + str[1] - '0' + 'a' - 1;
recurse(str + 2);
count--;
}
int main(int argc, char **argv) {
if(argc != 2)
return fprintf(stderr, "Usage: a.out <number>\n"), EXIT_FAILURE;
if(strlen(argv[1]) > sizeof word)
return fprintf(stderr, "Too long.\n"), EXIT_FAILURE;
recurse(argv[1]);
return errno ? (perror("numbers"), EXIT_FAILURE) : EXIT_SUCCESS;
}
在原始输入./a.out 12323465723
上运行时,它会给出
abcbcdfegbc
abcbcdfegw
abcwdfegbc
abcwdfegw
awbcdfegbc
awbcdfegw
awwdfegbc
awwdfegw
lcbcdfegbc
lcbcdfegw
lcwdfegbc
lcwdfegw
(我认为您已经在lcwdefgw
中进行了换位。)
答案 1 :(得分:1)
如果您要计算"ab"
的出现次数,则可以这样做:
int main()
{
char line[150];
int grup = 0;
cout << "Enter a line of string: ";
cin.getline(line, 150);
for (int i = 0; line[i] != '\0'; ++i)
{
if (line[i] == 'a' && line[i+1] == 'b')
{
++grup;
}
}
cout << "Occurences of ab: " << grup << endl;
return 0;
}
如果要将int转换为ASCII值,可以使用以下代码进行操作:
// Output ASCII-values
int nr;
do {
cout << "\nEnter a number: ";
cin >> nr;
nr += 96; // + 96 because the ASCII-values of lower case letters start after 96
cout << (char) nr;
} while (nr > 96 && nr < 123);
在这里,我使用C样式强制转换值以使事情保持简单。 还请记住ASCII值:ASCII Table
希望这会有所帮助。
答案 2 :(得分:1)
根据ASCII表,我们知道从65到90的A到Z。 所以下面是实现您正在尝试的简单逻辑。
int main(){
int n;
cin>>n;
n=n+64;
char a=(char) n;
if (a>=64 && a<=90)
cout<<a;
else cout<<"Error";
return 0;
}
答案 3 :(得分:1)
这个可能是一个有趣的问题,您可能将其标记为错误。这里没有关于C ++的特定内容,但是更多关于算法的信息。
首先,您描述的从数字到字母字符串的“解码”方法是不明确的。例如,135
可以解释为“ ace”或“ me”。这仅仅是疏忽还是预期的问题?
假设歧义仅仅是一个疏忽,并且用户将输入适当的数字,并用空格隔开(例如“ 1 3 5”或“ 13 5”)。假设nstr
是数字字符串,astr
是要计数的字母字符串,那么您将
i=0
,cnt=0
。k
中读取下一个整数nstr
(类似于this answer)。k
解码为字符ch
ch == astr[i]
,则递增i
i == astr.length()
,则设置i=0
并递增cnt
nstr
的末尾。 另一方面,假设打算进行模棱两可的解码(假定数字字符串具有多种解码方式),则需要进一步说明以便编写解决方案。例如,k
中有多少"1111"
个?如果"1111"
的计数无关紧要,那么给定aka
可以解码为kk
或k
,或者甚至是3,是1还是2。整个"1111"
被解码了吗?