2017-11-27 9 views
1

配列の順次要素を合計して最大合計を出力するプログラムを作成する必要があります。すべての要素が負の場合、私のアルゴリズムは動作しません。数値フィールドの最大和を求める

#include <iostream> 

int main() 
{ 
    int nums[1000] = {-1,-3,-4,-2,-5,-1,-9,-4,-2,-2}; 
    int sums[100][100]; 
    int n = 9; 

    for(int i = 0; i <= n; i++) { 
     for(int j = n; j >= i; j--) { 
      for(int k = j; k >= i; k--) { 
       sums[i][j] += nums[k]; 
      } 
     } 

    } 

    int max_sum = 0; 
    int max_begin; 
    int max_end; 

    for(int i = 0; i <= n; i++) { 
     for(int j = i+1; j <= n; j++){ 
       std::cout << "i = " << i << " j = " << j << ": " << sums[i][j] << "\n"; 
      if(max_sum < sums[i][j]) { 
       max_sum = sums[i][j]; 
       max_begin = i; 
       max_end = j; 
       } 
      } 
     } 

    std::cout << "Maximum: " << max_sum << " bei i = " << max_begin << " bis j = " << max_end; 

    return 0; 
} 

私はすでに、これは完全に正常に動作している間、私は別の方法を探していますので、我々はまだ私達の講義でclimitsを持っていなかった

#include <climits> 
... 
int max_sum = INT_MIN; 
... 

このソリューションを試してみました。

+0

なぜ「climits」を使用できませんか?どうすれば['std :: numeric_limits'](http://en.cppreference.com/w/cpp/types/numeric_limits)ですか?あなたは意図的に標準的な解決を避けていますが、何のためですか? –

+0

私は 'climits'を使うことができます。しかし、私たちの講義ではまだクライミングがなかったので、代替ソリューションが必要だと思っていました。私はそれを知ることに興味があります。 –

+0

'std :: numeric_limits'をどうすればいいですか?私はそれを私のコードに統合する方法を見ることができません –

答えて

3

変更に:

int max_sum = sums[0][0]; 

この方法であなたは番号の範囲を心配する必要はありません。

+1

しかし、空ではない範囲に依存します。 –

+0

@PasserBy 1000x1000にハードコードされています –

+1

私は運動上の問題も文字通りやりすぎない傾向があります。ベストプラクティスで答えてはいけませんか? –

0

これはstd::optionalタイプの主な動機の1つです(範囲内のすべての値が有効な場合)。我々は(未テストコード)をたい場合我々はさらにそれを模倣する単純なクラスを作ることができます

bool max_set = false; 
int max_sum = 0; 

// ... 
if (!max_set || max_sum < sums[i][j]){ 
    max_set = true; 
    max_sum = sums[i][j]; 
} 

:あなたはそれを使用することができない場合、我々は、単純なブールでの我々の目的のためにそれを真似することができます

class optional_int{ 
    bool is_set = false; 
    int value = 0; 
public: 
    bool operator()() const{return is_set;} 
    int& operator=(int _value){value = _value; is_set=true; return value;} 
    int& get(){ 
     if (!is_set){throw std::logic_error("attempting to access unset optional");} 
     return value; 
}; 

optional_int max_sum; 
//... 
if (!max_sum || max_sum.get() < sums[i][j]){ 
    max_sum = sums[i][j]; 
} 

このタイプをますます一般的にすることができますが、再実装することしかできません。std::optional

関連する問題