【问题标题】:No output from c++ loopc++循环没有输出
【发布时间】:2022-01-04 12:20:08
【问题描述】:

最近我编写了一个程序,从字符串中选择 k 个数字,按从左到右的顺序打印出具有 k 个字符的数字和最小的数字由字符串本身制成 例如 : 输入 : 3 89678982 输出:672 然后我的代码根本没有打印! 代码:

#include<bits/stdc++.h>
using namespace std;
int k,j=0,i;
string s;
int main() {
    cin>>k>>s;
    for(int i=0;i<s.size();i++) s[i]-=48;
    int the2=0;
    int Min=s[0];
    while(j<0) {
    for(i=the2;i<s.size();i++) {
            if(Min>s[i]) 
            {
                Min=s[i];
                break;
            }
        }
        the2=i;
        Min=s[i+1];
        cout<<Min;
        j++;
    }
}

为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 当您尝试调试此代码时,您的调试器会说什么?
  • 您从所有内容中减去了“0”(48),现在正在打印控制(不可见)字符。尝试 std::cout
  • Peoijn Kramer Min 是 int 而 s[i] 是 char。所以如果 s[i]='7' (在开始时)Min 将是 7 这不是最好的做法,但有效。

标签: c++ string algorithm iterator min


【解决方案1】:

对于初学者来说,while循环的这个条件

while(j<0) {

立即评估为 false,因为变量 j 已由 0 初始化。

int k,j=0,i;

还有这个for循环

for(i=the2;i<s.size();i++) {
        if(Min>s[i]) 
        {
            Min=s[i];
            break;
        }
    }

查找小于Min 的第一个字符,最初等于值s[0]。但是你需要在[0, s.length() - k + 1)范围内找到字符串的最小值

也就是说,程序确实按照作业中的描述进行操作。

你的意思好像是这样的。

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main()
{
    std::string s;
    size_t k = 0;

    std::cin >> k >> s;

    if (not ( s.size() < k ))
    {
        auto it = std::begin( s );

        for (size_t i = 0; i < k; i++)
        {
            it = std::min_element( it,
                     std::prev( std::end( s ), k - i - 1) );
            std::cout << *it++;
        }

        std::cout << '\n';
    }
}

如果进入

3 89678982

那么输出将是

672

如果使用 for 循环而不是调用标准算法 std::min_element 那么程序可以如下所示

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main()
{
    std::string s;
    size_t k = 0;

    std::cin >> k >> s;

    if (not ( s.size() < k ))
    {
        std::string::size_type pos = 0;

        for (size_t i = 0; i < k; i++)
        {
            for (auto j = pos; j < s.size() - k + i + 1; j++)
            {
                if (s[j] < s[pos]) pos = j;
            }

            std::cout << s[pos++];
        }

        std::cout << '\n';
    }
}

【讨论】:

  • 非常感谢!另外,您能否向我解释一下为什么我需要将 j 循环运行到 s.size()-k + 1 才能找到最小值?还有 size_t 类型是什么意思?
  • @TrươngQuangVinh 如果 k 等于例如 3,那么第一个数字可能不会在字符串的最后两个字符中找到,因为它们是为其他两个数字保留的。 size_t 是无符号整数类型。
【解决方案2】:

您不打印是因为j=0 所以while 循环的条件(j&lt;0) 从一开始就是假的。所以它的身体根本不会被执行。而你的cout 就在那个循环中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多