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;
}

变量名没有多大意义,因为我正在从程序的其他部分重用它们。我尝试过不同的变体,也尝试过其他方法。输出始终是它们在开始时设置的数字。我仍然无法弄清楚这一点,并希望能得到任何帮助。

4

3 回答 3

1

问题是您min使用 0 进行初始化,因此条件sum < min永远不会为真。

一个简单的解决方案是使用您在进入循环之前min获得的第一个值进行初始化。datain

尽管正如克里斯所说,还有更优雅的解决方案,例如使用std::min_element.

于 2013-10-09T06:39:21.283 回答
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);
}
于 2014-03-25T19:12:55.333 回答
0

有几件事:

num = 0 是错误的 不保存最好的数字是错误的

去 min = MAXINT;

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

应该这样做。

于 2013-10-09T06:49:03.603 回答