我怎样才能摆脱固定哨兵值(-32767)
How can I get rid of fixed sentinel value (-32767)?
下面是我写的程序,从给定数组中找到子数组的和,但是不知怎的,我没有得到我如何才能摆脱哨兵值(在这种情况下-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
相关文章:
- while 循环不以哨兵值终止
- 创建静态哨兵节点的正确方法是什么
- Merge_sort没有哨兵
- 我将如何安排具有哨兵值的多个 cin
- 无法获取哨兵值以读取多个 CIN 输入?
- 双变量输出 32767 始终代替用户输入
- 如何使用ISTream对象输入多个字符到对象的数组中?(and 0作为哨兵值.下面的我的代码将无效)
- C 哨兵环,存储最低和最大数量
- 这是哨兵线性搜索的错误方法吗?
- IOstream哨兵在到达末尾时不会设置故障位
- 对我是否需要一个哨兵值来终止我的 do while 循环以允许多个条目感到困惑
- 对如何摆脱没有哨兵值的无限循环感到困惑
- 是一个哨兵 QWidget 一个好主意(以防止在创建和填充布局时出现内存泄漏)
- 为什么宏的最小值是RAND_MAX,32767
- 使用模板构建哨兵节点 - C++
- 如何在C++的红黑树中创建哨兵 NIL 对象
- 生成大于32767的随机数
- 哨兵循环不会运行
- C++32767基于文本的游戏
- 我怎样才能摆脱固定哨兵值(-32767)