Исключение с плавающей точкой в ​​C++ из-за оператора деления

Я искал в Google, но мне не удалось найти решение моей проблемы. Вот мой код

#include <bits/stdc++.h>
#include<algorithm>
#include<cstdlib>
#include<cstdio>

using namespace std;

long long buyMaximumProducts(int n, long k, vector <int> a) {
    // Complete this function
    vector<pair<int, int>> p;
    long i;
    for(i=0; i<n; i++) {
        p.push_back(make_pair(a[i], i+1));
    }

    sort(p.begin(), p.end());

    if(k < p[0].first)
        return 0;

    long long sum=0,stocks=0;

    for(i=0;i<n;i++)
    {
        if((sum+p[i].first*p[i].second) <= k)
        {
            sum+=p[i].first*p[i].second;
            stocks+=p[i].second;
        } 
        else 
            break; 
    }

    long long amtleft=k-sum;
    **stocks+=(long long)(amtleft/p[i].first);**
    return stocks;

}

int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    for(int arr_i = 0; arr_i < n; arr_i++){
       cin >> arr[arr_i];
    }
    long long k;
    cin >> k;
    long long result = buyMaximumProducts(n, k, arr);
    cout << result << endl;
    return 0;
}

Я получаю исключение с плавающей запятой. Я думаю, что ошибка идет из-за заявления звезды. Может кто-нибудь подсказать, в чем может быть правдоподобная причина и как ее убрать?

1 ответ

Программа содержит как минимум 3 ошибки.

long long k;
cin >> k;
long long result = buyMaximumProducts(n, k, arr);

long long buyMaximumProducts(int n, long k, vector <int> a) {

k - это long long, но параметр k - это только long.

for(i=0;i<n;i++) {
    if((sum+p[i].first*p[i].second) <= k) {
        sum+=p[i].first*p[i].second;
        stocks+=p[i].second;
    } else 
        break; 
}

если мы никогда не доберемся до "перерыва", то "я" не действует для

stocks+=(long long)(amtleft/p[i].first);

вызывая исключение.

и если

p[i].first

ноль, вы получите деление на ноль исключения.

Другие вопросы по тегам