我有一个文件,里面有一个整数列表,并试图找到最接近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 :(得分:1)
问题是您正在使用0初始化min
,因此条件sum < min
永远不会成立。
一个简单的解决方案是使用您在进入循环之前从min
获得的第一个值来初始化datain
。
虽然正如chris所述,但有更优雅的解决方案,例如使用std::min_element
。
答案 1 :(得分:1)
如果你有一个任何可排序的向量并且与less-than(&lt;)相当,那么这可能是一个解决方案:
#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);
}
答案 2 :(得分:0)
有一些事情:
num = 0错了 不保存最佳数字是错误的
转到min = MAXINT;
int besthit;
while(datain)
{
datain >> num;
sum = abs(num - 200);
if(sum < min) {
besthit = num;
min = sum;
}
}
应该这样做。