【问题标题】:C++ How to read input N and then read a series of numbers N long?C ++如何读取输入N然后读取一系列N长的数字?
【发布时间】:2022-01-02 23:42:06
【问题描述】:

我正在做一个任务,我需要创建一个程序来读取一个非空的整数序列,并告诉其中有多少等于最后一个。

它应该读取序列的整数数量,然后读取序列本身并返回最后一个数字重复自身的次数,不包括最后一个。

输入会是这样的:

9
1 7 3 2 4 7 5 8 7

输出应该是:

2

现在,我对程序的功能没有任何问题,但我正在努力让它读取输入。这是我得到的:

#include <iostream>
#include <vector>
#include <sstream>

int NumbersEqualToLast(int limit, std::vector<int> elements) {
  int check = elements[limit], counter = 0;
  for (int i = limit; i >= 0; i--) {
    if (elements[i] == check) {
      counter++;
    }
  }
  return(counter);
}

int main() {
  int amount, number;
  std::cin >> amount;

  std::string input;
  getline(std::cin, input);
  std::stringstream iss(input);
  std::vector<int> numbers;
  while ( iss >> number ) {
    numbers.push_back( number );
  }
  std::cout << NumbersEqualToLast(amount, numbers) << std::endl;
} 

问题是在读取整数的数量(在本例中为 9)后,我收到了 Segmentation fault (core dumped) 错误。

解决后编辑

这就是使用您的建议对我有用的方法。谢谢你。 我知道它是否不漂亮或者有更好更有效的方法,但我才刚刚开始。 :)

#include <iostream>
#include <vector>

int NumbersEqualToLast(int limit, std::vector<int> elements) {
  int check = elements[limit - 1], counter = 0;
  for (int i = limit - 2; i >= 0; i--) {
    if (elements[i] == check) {
      counter++;
    }
  }
  return(counter);
}

int main() {
  int quantity;
  std::cin >> quantity;
  int number;
  std::vector<int> numbers;
  for (int i = 0; i < quantity; i++) {
    std::cin>>number;
    numbers.push_back(number);
  }
  std::cout << NumbersEqualToLast(quantity, numbers) << std::endl;
}

【问题讨论】:

  • 您的问题是关于如何在循环中读取 N 个值。您的问题描述了 循环之后发生的事情(很可能在您未显示的函数中)。为了解决标题中的问题,当向量达到该大小时,您将停止读取值。在循环之后,您应该确保您 确实 实际上读取了足够的值。作为一种好的做法,您应该在将已知数量的数据推送到向量之前保留存储空间:例如 numbers.reserve(amount);
  • 现在您已经更新了问题,我们可以看到elements[limit] 超出范围。最后一个元素位于索引limit - 1。或者您可以使用elements.back()。顺便说一句,养成通过引用将向量传递给函数而不是复制它们的习惯。
  • 在现实世界中,这将通过std::count 完成。
  • std::count(numbers.begin(), numbers.end(), numbers.back()) - 1; -- 停止编写循环并学习算法函数。基本上是一条线的解决方案。

标签: c++ string vector segmentation-fault getline


【解决方案1】:

请不要苛刻地评判。我建议另一种方法来解决这个问题。

#include <iostream>
#include <vector>
using namespace std;
int special, count;
void dfs(int current, int previous, vector<int>& visited, vector<int>& input)
{
    if(visited[current]==1)
    {
        return;
    }
    visited[current]=1;
    if(current==(input.size()-1))
    {
        special=input[current];
    }
    for(int next=(current+1); next<input.size(); ++next)
    {
        if(next==previous)
        {
            continue;
        }
        dfs(next, current, visited, input);
    }
    if(special==input[current])
    {
        ++count;
    }
    if(current==0)
    {
        --count;
        cout<<count;
    }
    return;
}
void solve()
{
    int quantity;
    cin>>quantity;
    int number;
    vector<int> numbers;
    for(int i=0; i<quantity; ++i)
    {
        cin>>number;
        numbers.push_back(number);
    }
    vector<int> visited(quantity);
    dfs(0, -1, visited, numbers);
    return;
}
int main()
{
    solve();
    return 0;
}

输入:

9
1 7 3 2 4 7 5 8 7

结果如下:

2

【讨论】:

  • dfs?您是否在错误的问题下错误地发布了答案?
  • @Marek R,尊敬的 Marek,我试图返回最后一个数字重复的次数,不包括最后一个。
  • @Marek R,尊敬的 Marek,您的解决方案比我的要快。你是对的。
  • 我使用了将序列输入向量的方式,现在我的程序可以工作了。谢谢。
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多