一个复杂的c++题不会做

c++题目求解
题目描述
在这个挑战中,将字符串转换为由单个空格分隔的一系列单词(或字符序列),每个单词的长度与圆周率(π)的十进制表示的前 15 位相同:
3.14159265358979

如果一个字符串包含的字符多于 π 数字总和给出的总数,则丢弃未使用的字符,您将只使用构成 15 个单词所需的字符。

String = "HOWINEEDADRINKALCOHOLICINNATUREAFTERTHEHEAVYLECTURESINVOLVINGQUANTUMMECHANICSANDALLTHESECRETSOFTHEUNIVERSE"
Pi String = "HOW I NEED A DRINK ALCOHOLIC IN NATURE AFTER THE HEAVY LECTURES INVOLVING QUANTUM MECHANICS"
每个单词都有相同长度的π在相同的下标处?
"HOW" = 3, "I" = 1, "NEED" = 4, "A" = 1, "DRINK" = 5
"ALCOHOLIC" = 9, "IN" = 2, "NATURE" = 6, "AFTER" = 5
"THE" = 3, "HEAVY" = 5, "LECTURES" = 8, "INVOLVING" = 9
"QUANTUM" = 7, "MECHANICS" = 9
3.14159265358979
此外,如果一个字符串包含的字符少于 π 数字总和给出的总数量,在任何情况下,你必须尊重数字的序列来获得单词。

String = "FORALOOP"
Pi String = "FOR A LOOP"
每个单词都有相同长度的Pi在相同的下标处?
"FOR" = 3, "A" = 1, "LOOP" = 4
3.14
如果字符串中包含的字母与数字不完全匹配,在这种情况下,您将重复最后一个字母,直到单词具有正确的长度。

String = "CANIMAKEAGUESSNOW"
Pi String = "CAN I MAKE A GUESS NOWWWWWWW"
每个单词都有相同长度的Pi在相同的下标处?
"CAN" = 3, "I" = 1, "MAKE" = 4, "A" = 1, "GUESS" = 5, "NOW" = 3
3.14153 (Wrong!)
第6个单词“NOW”的长度(3)…
...与Pi(9)的第六位不匹配
最后一个字母“W”将被重复……
...直到单词的长度与数字匹配为止
"CAN" = 3, "I" = 1, "MAKE" = 4, "A" = 1, "GUESS" = 5, "NOWWWWWWW" = 9
3.14159 (Correct!)
如果给定字符串为空,则必须返回一个空字符串。

给定一个字符串 txt,实现一个函数,该函数返回根据上述说明格式化的相同字符串。

输入输出格式
输入格式
第一行有一个字符串;
输出格式
一行输出字符串,表示 Pilish 字符串,每个字符串单词用一个空格隔开。

输入输出样例1
输入
33314444
输出
333 1 4444
解释(可选)
3.14

输入输出样例2
输入
HOWINEEDADRINKALCOHOLICINNATUREAFTERTHEHEAVYLECTURESINVOLVINGQUANTUMMECHANICSANDALLTHESECRETSOFTHEUNIVERSE
输出
HOW I NEED A DRINK ALCOHOLIC IN NATURE AFTER THE HEAVY LECTURES INVOLVING QUANTUM MECHANICS
解释(可选)

"HOW" = 3, "I" = 1, "NEED" = 4, "A" = 1, "DRINK" = 5
"ALCOHOLIC" = 9, "IN" = 2, "NATURE" = 6, "AFTER" = 5
"THE" = 3, "HEAVY" = 5, "LECTURES" = 8, "INVOLVING" = 9
"QUANTUM" = 7, "MECHANICS" = 9
3.14159265358979
说明提示
在函数中不需要考虑将 π 的整数部分与小数部分分开的点:它出现在指令和示例中只是为了便于阅读。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这道题可以分为以下步骤:

  1. 将 π 的前 15 位提取出来作为单词的长度。

  2. 依据单词长度,将输入的字符串分割为一组单词。

  3. 输出分割后的单词,每个单词之间用空格隔开。

对于步骤 1,我们可以使用 sprintf() 函数将 π 的前 15 位格式化成一个字符串,然后使用 strlen() 函数计算出字符串长度,即为单词的长度。

对于步骤 2,我们可以使用循环将输入的字符串分割为一组单词,然后将单词保存到一个数组中。

对于步骤 3,我们可以使用循环遍历单词数组,然后将每个单词输出到标准输出,并在每个单词之间输出一个空格。

以下是一个可能的 C++ 实现:

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

const string PI = "314159265358979";

int main() {
    string s;
    getline(cin, s);

    int n = s.length();
    int m = PI.length();

    int pos = 0; // 当前字符串位置
    for (int i = 0; i < m && pos < n; ++i) {
        int len = PI[i] - '0';
        if (pos + len > n) {
            len = n - pos; // 如果当前字符串剩余的长度小于 len,就使用当前剩余长度
        }
        string word = s.substr(pos, len); // 取出当前字符串中的一个单词
        cout << word << ' ';
        pos += len;
    }

    return 0;
}


此实现首先读入字符串,然后逐个字符读入 π 的前 15 个数字,并使用它们来确定每个单词的长度。然后使用 substr 函数在输入字符串中提取每个单词,并将其输出。

这个就是字符串的处理,用kvm算法匹配