给定n个数字,编写例程以找到4个连续数字之间的最大数字

时间:2017-03-07 23:16:47

标签: c++ algorithm

我试图弄清楚如何从序列中的前四个数字中找到最大的数字,然后找到序列中接下来的四个数字中最大的数字......等等。

我写了一个函数,找到数组中最大的元素:

double max_array(int n, double array[]){
    double arr[n];
    arr[0] = 0;
    double max;
    for(int i = 0; i < n; i++)
        {
           if(arr[0] < array[i])
               arr[0] = array[i];
        }
    max = arr[0];
    return max;
}

我相信我可以用我在这里所做的来编写一个例程来完成我所描述的后者,但我不知道该怎么做。也许我必须写一个全新的功能,但我不确定,任何建议都非常感谢。

3 个答案:

答案 0 :(得分:2)

这应该或多或少地做你想要的。有多个结果,一个用于输入数组中的每个四元组:

#include <valarray>
#include <cassert>

std::valarray<double> maxQuads(std::valarray<double> input) {
    assert(!(input.size() % 4)); // The input must contain a multiple of 4 values
    std::valarray<double> output(input.size() / 4);
    for(std::size_t sliceIndex = 0; sliceIndex + 4 < input.size(); sliceIndex += 4) {
        std::slice slice(sliceIndex, 4, 1);
        output[sliceIndex / 4] = std::valarray(input[slice]).max();
    }
    return output;
}

void test() {
    double aTestArray[] = {1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5};
    std::valarray results = maxQuads(std::valarray(aTestArray, 8));
    std::cout << "Max of the first 4: " << results[0];
    std::cout << "Max of the second 4: " << results[1];
}

答案 1 :(得分:1)

好吧,你可以重用max_array

// Assume I have an array 'foo' with N elements.
// In your code, N should be an actual value, like 10, and NOT a variable.

double V[N/4];
int i = 0;
while (i+4 < N) {
    // use the i-th element of foo as the 0-th
    // element of 'array' in max_array.
    double V[i/4] = max_array(4, &(foo[i]));

    i += 4;
}

请注意,使用上面的代码,如果N不是4的倍数,比如N = 6,那么最后的元素将不会被考虑在内。

例如,如果foo等于{ 0.0, 1.0, 1.5, 2.1, 5.0, 10.3 },那么V将只有一个元素。 { 2.1 }

答案 2 :(得分:0)

如果你想使用你已经拥有的功能,你可以这样做 创建另一个调用你已经拥有的函数的函数。

double* max_array_vec(int n, double array[]){
    int max_mumber = n/4 + (n%4); // how many max number you will have
    double max[max_number];
    double temp[4];
    arr[0] = 0;

    for(int i = 0; i < max_number; i++)
    { 
        std::copy(array+ (3 * i), array+ (3 * (i + 1)), temp);
        max[i] = max_array(4,temp);
    }
    max = arr[0];
    return max;
}

但你可以制作另一个完成整个过程的功能,它可以更容易。

编辑第二部分

double *max_array(int n, double *array){
double arr[n/4 + 1] = {-1000, } ;// since ur looking for the biggest number u should initialize tis array with numbers really small like -400 or something like that 
int index = 0;
for(int i = 0; i < n; i++)
{ 
   if(i%4 == 0 && i!= 0)
      index++;

   if(arr[index] < array[i])
      arr[index] = array[i];

}
//printf("\n");
//for(int i = 0; i < 4; i++)
//printf("%f\n ", arr[i]);

return arr;
}

问题是在第一次我没有忽略i = 0时我不需要增加索引