Найти номер, ближайший к другому числу с ++

0

У меня есть файл, в котором есть список целых чисел, и он пытается найти, что ближе всего к 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;
}

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

Теги:
integer
closest

3 ответа

1
Лучший ответ

Проблема в том, что вы инициализируете 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);
}
0

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

num = 0 неверно, а не сохранение лучшего числа неверно

перейти на min = MAXINT;

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню