C ++如何从字母或数字的输入中输出字母或数字

时间:2019-03-16 17:15:47

标签: c++ c algorithm

所以我们说以下情况:对于“ 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的值

正如您所见,这是问题的最后部分,对此您进行了编辑,谢谢所有到目前为止为我提供帮助的人,我已经设法解决了一半的问题,只剩下上述问题了。

解决->谢谢

4 个答案:

答案 0 :(得分:3)

这涉及每个步骤0到2个结果之间的决定。基本情况是没有更多的字符或不能使用它们。在后一种情况下,我们回溯以输出整个树。我们将worddynamic 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是要计数的字母字符串,那么您将

  1. 设置i=0cnt=0
  2. k中读取下一个整数nstr(类似于this answer)。
  3. k解码为字符ch
    1. 如果ch == astr[i],则递增i
    2. 如果i == astr.length(),则设置i=0并递增cnt
  4. 从2开始重复,直到到达nstr的末尾。

另一方面,假设打算进行模棱两可的解码(假定数字字符串具有多种解码方式),则需要进一步说明以便编写解决方案。例如,k中有多少"1111"个?如果"1111"的计数无关紧要,那么给定aka可以解码为kkk,或者甚至是3,是1还是2。整个"1111"被解码了吗?