我怎样才能摆脱固定哨兵值(-32767)

How can I get rid of fixed sentinel value (-32767)?

本文关键字:哨兵 -32767      更新时间:2023-10-16

下面是我写的程序,从给定数组中找到子数组的和,但是不知怎的,我没有得到我如何才能摆脱哨兵值(在这种情况下-32767)?我该如何优化它?我怎么能跟踪最大子数组的范围呢?

#define EVALUE -32767
using namespace std;
int findMaxSubArray(vector<int>,int low,int high);
int findMaxSubArray_Mid(vector<int>,int low,int high);
int main()
{
    vector<int> v;
    int j=0;
    cout << "Enter array values(-32767 to end): ";
    while(1)
    {
        cin >> j;
        if (EVALUE==j)
            break;
        v.push_back(j);
    }
if(v.size()!=0)
    cout << "Max sum is: " << findMaxSubArray(v,0,v.size()-1) << "n";
else
    cout << "No array elements entered, exiting...n";
system("pause");
return 0;
}
int findMaxSubArray(vector<int> v, int low, int high)
{
    if(low==high) return v[low];
    int max_mid_sum=findMaxSubArray_Mid(v,low,high);
    int max_left_sum=findMaxSubArray(v,low,(low+high)/2);
    int max_right_sum=findMaxSubArray(v,(low+high)/2+1,high);
    if (max_mid_sum>max_left_sum) return (max_mid_sum>max_right_sum?max_mid_sum:max_right_sum);
    else return(max_left_sum>max_right_sum?max_left_sum:max_right_sum);
}
int findMaxSubArray_Mid(vector<int> v,int low,int high)
{
    int mid=high/2;
    int max_left_sum=0;
    int max_right_sum=0;
    int sum=0;
    for(int i=mid;i>=low;--i)
    {
        sum+=v[i];
        if(sum>max_left_sum)    
        {
            max_left_sum=sum;
        }
    }
    sum=0;
    for(int i=mid+1;i<=high;++i)
    {
        sum+=v[i];
        if(sum>max_right_sum)   
        {
            max_right_sum=sum;
        }
    }
    return (max_right_sum+max_left_sum);
}

从文本文件中读取时,cin将获得的最后一个字符是"EOF"字符,即文件结束字符。您可以在命令行中使用control+d将该字符发送到程序中。你会想要检查这个而不是-32767。

这是一个基本的程序,可以为你的问题找到一个简单的解决方案:

#include <vector>
#include <iostream>
using namespace std;
int main()
{
    vector<int> v;
    int j;
    cout << "Enter array values (Control+D (EOF) to end): ";
    cin >> j;
    while(cin.good())
    {
        v.push_back(j);
        cin >> j;
    }
    return 0;
}

如果你想变得非常聪明,你可以使用下面的命令,它会直接将内存的内容插入到你的向量中(从开始到EOF)。就运行时间而言,这可能比您的解决方案和上面的解决方案更快。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
    vector<int> v;
    cout << "Enter array values (Control+D (EOF) to end): ";
    istream_iterator<int> in(cin);
    istream_iterator<int> eof;
    copy(in, eof, back_inserter(v));
    ostream_iterator<int> out(cout, "n");
    copy(v.begin(), v.end(), out);
    return 0;
}

关于哨兵,IIRC用Control+D关闭标准输入(可能取决于操作系统)。这将导致<<失败(我不确定如何失败,可能必须捕获异常)。

无论如何,代码的其余部分只是向量的递归(二项)相加。你可以用一个简单的for 来代替它
for(int i = 0; i < v.size(); i++) {
  total += v[i]
}

关于最大子数组范围的问题已经由类Vector

管理