有没有办法可以将一系列数字划分为某些子范围
即。 如果我们的范围是1-10
用户输入1 3,4 7,7 10 我们将范围1-3定义为一个范围的一部分,将4-7定义为另一个范围,依此类推。 例如,如果输入数字8,我们将输出作为范围3。
正在考虑创建一个数组 int arr [10] ,并作为用户输入1 3,例如然后arr [0] = 1和arr [2] = 1,然后是4 7 as arr [ 3] = 2且arr [6] = 2。但这会错过中间的数字,如果我们从0到2和3到6循环。在数组大于10的更大规模上,这将是低效的。
有人可以帮助我吗?
答案 0 :(得分:3)
定义范围类型:
struct range
{
int low;
int high;
}
然后定义一个这样的数组:
struct range ranges[<some size>] = {0};
定义并实现查找最高high
和最低low
最低值的函数:
int lowest(struct range * ranges, int * plowest);
int highest(struct range * ranges, int * phighest);
输入所有范围并将其存储在ranges
中。
在highest()
上拨打lowest()
和ranges
,您就拥有了外部的间隔:
struct range range_outer = {0};
/* code reading ranges. */
if (0 != lowest(ranges, &range_outer.lowest))
fprintf(stderr, "lowest() failed\n");
if (0 != highest(ranges, &range_outer.highest))
fprintf(stderr, "highest() failed\n");
为了帮助lowest()
和highest()
,对于前者,成员ranges
为成员low
排序high
可能是有意义的。
int sort_by_low(struct ranges * ranges);
int sort_by_high(struct ranges * ranges);
使用qsort()
函数可以轻松地对数组进行排序。
答案 1 :(得分:0)
完整的工作实施:
#include <iostream>
#include <vector>
using namespace std;
typedef struct
{
int min; int max; int range;
} RANGE;
int InRange(int num, RANGE range)
{
if (num >= range.min && num <= range.max)
return 1;
return 0;
}
int main()
{
vector<RANGE> list; int count = 0, rangesCount = 0;
puts("How many ranges?");
cin >> rangesCount;
puts("Input the range defenitions as a min-max-range pairs(Enter min, then enter max, then enter the output range):");
for (int i = 0; i < rangesCount; i++)
{
RANGE range;
cin >> range.min;
cin >> range.max;
cin >> range.range;
list.push_back(range);
}
while (1)
{
puts("Now, enter a value, to know in what range it exist:");
int num;
cin >> num;
for (int i = 0; i < rangesCount; i++)
{
RANGE r = list.at(i);
int included = InRange(num, r);
if (included)
{
cout << "The output range is " << r.range << "\n\n";
}
}
}
}
许多事情都可以改进,您可以根据自己的需要进行定制。