integer — Найти номер, ближайший к другому числу. Переполнение стека

У меня есть файл со списком целых чисел, и я пытаюсь найти, который ближе всего к 200. Я работал над этим время от времени и весь день и пытался сделать это сам, прежде чем приехать сюда. Я знаю, что я должен взять другое и сравнить его, но это все, что я получил до сих пор. Мы еще не рассмотрели массив или создание функций.

список номеров в файле
55 67 458 23 81 33
782 375 528
405 324 950 46
14 864 551 38 167 518 630

код у меня до сих пор

#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

int main()
{
ifstream datain;
datain.open("c:\\DataFile2.txt");
int count, sum, num, min, max;
count = sum = num = min = max = 0;

while(datain)
{
datain >> num;
sum = abs(num - 200);
if(sum < min)
sum = num;
}

Имена переменных не имеют особого смысла, потому что я повторно использую их из других частей программы. Я пробовал разные варианты этого, и я пробовал другие способы. на выходе всегда указывается число, на которое они установлены в начале. Я до сих пор не могу понять это и был бы признателен за любую помощь, которую я могу получить.

0

Решение

Проблема в том, что вы инициализируете min с 0, так что условие sum < min никогда не будет правдой.

Простое решение — инициализировать min используя первое значение, которое вы получаете от datain перед входом в цикл.

Хотя как Крис сказал, что есть более элегантные решения, такие как использование std::min_element,

1

Другие решения

Если у вас есть вектор чего-нибудь сортируемого и сопоставимого с менее чем (<), это может быть решением:

#include <algorithm>
#include <vector>
using namespace std;

/*
* Find the element in haystack closest to needle.
* NOTE: haystack must be sorted
*/
template<typename T>
T find_closest (T needle, std::vector<T> haystack) {

/* handle special cases where needle
* is smaller than the first or bigger
* than the last element
*/
if (needle <= haystack.front()) {
return haystack.front();
}
if (needle >= haystack.back()) {
return haystack.back();
}

auto closest = adjacent_find(haystack.begin(), haystack.end(),
[&needle] (T i, T j) {return i =< needle && needle <= j;});

return (needle-(*closest) < *(closest+1)-needle) ? *closest : *(closest+1);
}

int main ()
{
int needle = 200;
std::vector<int> haystack = {55, 67, 458, 23, 81, 33, 782, 375, 528, 405, 324,
950, 46, 14, 864, 551, 38, 167, 518, 630};
sort(haystack.begin(), haystack.end());
int found = find_closest(needle, haystack);
}
1

Есть несколько вещей:

num = 0 неверно
неправильно сохранять лучший номер

идти на мин = MAXINT;

int besthit;
while(datain)
{
datain >> num;
sum = abs(num - 200);
if(sum < min) {
besthit = num;
min = sum;
}
}

должен сделать это.

0