2017-03-07 95 views
1

我想弄清楚如何从序列中的前四个数字中找到最大的数字,然后在下一个数字中找到最大的数字序列,等等给定n个数字,编写例程以查找4个连续数字之间的最大数字

我写道,发现最大的数组中的元素是这里的函数:

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

我相信我可以用我在这里做了写一个程序做后面我描述,但我不知道如何做到这一点。也许我必须写一个全新的函数,但我不确定,任何建议都不胜感激。

+0

你是对的,你可以用'max_array'去做吧。通过四个元素遍历数组(在每次迭代中跳过四个元素),并且对于每次迭代,使用'n = 4'和'array'调用'max_array'等于指向当前元素的指针。 – GigaRohan

+0

@GigaRohan感谢您的评论,当谈到C++术语时,我仍然是一个新手,所以我不完全理解。你能否提供一个扩大你刚才所说的答案? – Scooby

+0

Anthony D.提供了下面的代码 – GigaRohan

回答

0

如果u想使用你已经拥有你能做到这一点的功能这样 创建调用你已经有了功能的另一个功能。

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时,我不需要增加索引

+0

您的代码为第二部分几乎对的,但不顺心的事假设我们在传递数组具有以下元素:0 0.5 0.25 0.75 0.125 0.625 0.375 0.875 0.0625 0.5625 0.3125 0.8125 – Scooby

+0

那么你的函数返回0 0.75 0.875 – Scooby

+0

在换言之,arr [0] = 0.75,a rr [1] = 0.875,arr [2] = 0.8125 – Scooby

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

你可能想'i + = 4'来满足这里的要求。如果N不是4的倍数,则最后一组的边界情况。假设N在这里是常数,因为VLA不是C++标准的一部分。 – paddy

+0

如果我想将第4个数字存储在一个数组调用V中,那么V [0]将是前4个中的最大值,然后V [1]将是第4个中的最大值,我可以使用你有做到这一点吗? – Scooby

+0

@paddy啊,谢谢。我已经把'++ i',因为我理解了“*序列中接下来的四个数字*”,意思是“* 0th到3rd,然后是1st到4th等*”。关于'N',我假定'N'是一个编译时常量,但是在你有用的评论之后,我添加了一个'#define'。 –

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]; 
} 
+0

你的函数可以用来传递一个双精度数组吗? – Scooby

+0

@Scooby添加了一个如何传入双精度数组的示例。如果需要的话,你可以创建一个包装函数。 – Vality

+0

如果我想将第4个数字存储在一个数组调用V中,那么V [0]将是前4个中的最大值,然后V [1]将是第4个中的最大值,我可以使用你有做到这一点吗?在函数'test()中' – Scooby