2017-03-07 93 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