为什么我在这个问题上有隔离错误

why am I getting seg fault in this?

本文关键字:隔离 错误 问题 为什么      更新时间:2023-10-16

问题陈述

Mark是一名本科生,他对轮岗很感兴趣。镇上正在进行一场传送带比赛,马克想赢。在比赛中,有一条传送带,可以表示为1xN块的条带。每块木块上都写着一个数字。皮带以这样的方式旋转,每次旋转后,每个块都向左移动,第一个块移到最后一个位置。

输送带附近有一个开关,可以使输送带停止。每个参与者将有一次机会停止皮带,并计算他的PMEAN。

PMEAN是使用皮带停止时在皮带上的顺序计算的。PMEAN最高者为优胜者。可以有多个赢家

马克想成为赢家之一。

他应该努力得到什么才能保证他成为赢家?

定义
  • PMEAN = (i = 1到n的总和)(i * i列表中的数字)式中I为输送带停止时,输送带处的块的索引。索引从1.

输入格式
  • 第一行包含N,表示皮带上的元素数量。
  • 第二行包含N个空格分隔的整数。

输出格式
  • 输出所需的PMEAN

的约束
  • 1≤n≤10^6
  • -10^9≤每个数字≤10^9

代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main (void)
{
    int n;
    cin>>n;
    vector <int> foo;
    int i = 0,j = 0,k,temp,fal,garb=0;
    while (i < n)
    {
        cin>>fal;
        foo.push_back(fal);
        i++;
    }
    vector<int> arr;
    //arr.reserve(10000);
    for ( i = 0; i < n; i++ )
    {
        garb = i+1;
        arr.push_back(garb);    
    }
    long long product = 0;
    long long bar = 0;
    while (j < n)
    {
        i = 0;
        temp = foo[0];
        while ( i < n-1 )
        {
            foo[i] = foo[i+1];
            i++;
        }
        foo[i] = temp;
        for (  k = 0; k < n; k++ )
            bar = bar + arr[k]*foo[k];    
        if ( bar > product )
            product = bar;    
        j++;
    }
    return 0;
}

我的问题:

我所做的基本上是尝试原始数组的不同组合,然后将其与包含值1 2 3 ......的数组相乘,然后返回最大值。然而,我在这得到一个分割错误。

为什么会这样?

下面是你的一些代码:

vector <int> foo;
int i = 0;
while (i < n)
{
    cin >> fal;
    foo[i] = fal;
    i++;
}

当您执行foo[0] = fal时,将导致未定义行为。foo中还没有[0]的空间。你可能想用std::vector::push_back()代替。

vector<int> arr;

上工作时也会出现同样的问题
作为题外话,人们通常会用for循环来写这个循环:
for (int i=0; i<n; i++) {
    int fal;
    cin >> fal;
    foo.push_back(fal);
}

关于更新后的代码:

  • 永远不要在第一个循环中增加i
  • garb从未初始化。