最近看《C++ Primer》,有这样一个题目
读入一组整数并把它们存入一个vector对象,将每对相邻整数的和输出出来。
这里要注意输入的奇数个和偶数个的数的区别。偶数个整数的话刚好数全部用完,奇数个整数最后一个数空出来,也输出出来,后面没有数了(再使用后面的索引vector就越界了)
#include
#include
using namespace std;
int main()
{
vector<int> ivec;
int i;
while (cin >> i)
ivec.push_back(i);
for (decltype(ivec.size()) ind = 0; ind < ivec.size(); ind = ind + 2)
{
if (ind == (ivec.size() - 1))
cout << ivec[ind];
else
cout << ivec[ind] + ivec[ind + 1] << " ";
}
}
测试结果
奇数输入

偶数输入

这个写法在循环里面使用了多次的if判断,如果能把if判断移到外面去可以减少比较的时间,提高速度。改写算法如下:
#include
#include
using namespace std;
int main()
{
vector<int> ivec;
int i;
decltype(ivec.size()) ind_dmax;
bool flag;
while (cin >> i)
ivec.push_back(i);
if (ivec.size() % 2 != 0)
{
flag = 1;
ind_dmax = ivec.size() - 2;
}
else
{
flag = 0;
ind_dmax = ivec.size() - 1;
}
for (decltype(ivec.size()) ind = 0; ind < ind_dmax; ind = ind + 2)
{
cout << ivec[ind] + ivec[ind + 1] << " ";
}
if (flag)
cout << ivec[ivec.size() - 1];
}
改写你的程序,这次要求先输出第1个和最后1个元素的和,接着输出第2个和倒数第2个元素的和,以此类推。
采用同样的思路
#include
#include
using namespace std;
int main()
{
vector<int> ivec;
int i;
bool flag;
while (cin >> i)
ivec.push_back(i);
decltype(ivec.size()) ind_dmax = ivec.size() / 2 - 1;
if (ivec.size() % 2 != 0)
{
flag = 1;
}
else
{
flag = 0;
}
for (decltype(ivec.size()) ind = 0; ind <= ind_dmax; ++ind)
{
cout << ivec[ind] + ivec[ivec.size() - 1 - ind] << " ";
}
if (flag)
cout << ivec[ivec.size() / 2];
}
测试结果
奇数输入

偶数输入
if还可以改成条件运算符,代码会更加的简洁
if (ivec.size() % 2 != 0)
{
flag = 1;
}
else
{
flag = 0;
}
改为
flag = (ivec.size() % 2 != 0) ? 1 : 0;
完整的代码:
#include
#include
using namespace std;
int main()
{
vector<int> ivec;
int i;
bool flag;
while (cin >> i)
ivec.push_back(i);
decltype(ivec.size()) ind_dmax = ivec.size() / 2 - 1;
flag = (ivec.size() % 2 != 0) ? 1 : 0;
for (decltype(ivec.size()) ind = 0; ind <= ind_dmax; ++ind)
{
cout << ivec[ind] + ivec[ivec.size() - 1 - ind] << " ";
}
if (flag)
cout << ivec[ivec.size() / 2];
}