题目:
https://acm.hdu.edu.cn/showproblem.php?pid=2006
解答:
#include <iostream>
using namespace std;
#define SLDataType int
struct Sequlist{
SLDataType* array;
int size;
int capacity;
};
//********************顺序表初始化***********/
void InitSequlist(Sequlist* sl, int capacity) {
sl->array = new SLDataType[capacity];
sl->size = 0;
sl->capacity = capacity;
}
//********************顺序表销毁************/
void DestorySequlist(Sequlist* sl) {
delete[] sl->array;
}
//**********************获取顺序表长度******//
int GetSequlistLength(Sequlist* sl) {
return sl->size;
}
//**********************判断顺序表是否为空***//
bool SequlistEmpty(Sequlist* sl) {
return sl->size == 0;
}
//***************顺序表的插入********** */
void insertSequlist(Sequlist* sl, int pos, SLDataType x) {
//判断pos是否合法
if(pos < 0 || pos > sl->size){
printf("插入位置不合法\n");
}
//判断是否需要增容
if(sl->size == sl->capacity){
int newCapacity = sl->capacity * 2;
SLDataType* newArry = new SLDataType[newCapacity];
for(int i = 0;i < sl->size;i++){
newArry[i] = sl->array[i];
}
delete[] sl->array;
sl->array = newArry;
sl->capacity = newCapacity;
}
//往后挪数据
for (int i = sl->size; i > pos; i--)
{
sl->array[i] = sl->array[i-1];
}
//插入数据
sl->array[pos] = x;
//更新大小
sl->size++;
}
//***************************顺序表的删除元素 */
void deleteSequlist(Sequlist* sl, int pos){
//判断pos是否合法
if(pos < 0 || pos > sl->size){
printf("插入位置不合法\n");
}
//删除元素
for(int i = pos;i < sl->size;i++){
sl->array[i] = sl->array[i+1];
}
//更新大小
sl->size--;
}
//**************************顺序表查找元素下标索引 */
int findSequlistIndex(Sequlist* sl, int x){
for (int i = 0; i < sl->size; i++)
{
if (sl->array[i] == x)
{
return i;
}
}
return -1;
}
//************************顺序表查找元素 */
int getSequlist(Sequlist* sl, int pos){
//判断pos是否合法
if(pos < 0 || pos > sl->size){
printf("插入位置不合法\n");
}
//得到元素
return sl->array[pos];
}
//***********************更新数据********//
void updateSequlist(Sequlist* sl, int pos, SLDataType x){
//判断pos是否合法
if(pos < 0 || pos > sl->size){
printf("插入位置不合法\n");
}
//更新元素
sl->array[pos] = x;
}
//主要部分
int main()
{
int n;
while(cin>>n){
int x,y;
Sequlist sl;
InitSequlist(&sl,1);
for (int i = 0; i < n; i++)
{
cin>>x;
insertSequlist(&sl,i,x);
}
int z = 1;
for (int i = 0; i < sl.size; i++)
{
y = getSequlist(&sl,i);
if (y%2 == 1)
{
z = z * y;
}
}
cout<<z<<endl;
}
return 0;
}
遇见问题:
我把Sequlist sl; InitSequlist(&sl,1);放在while外面,结果出现
3 1 2 3
3
4 2 3 4 5
45
3 1 2 3
135
3 1 2 3
405
但我把Sequlist sl; InitSequlist(&sl,1);放在while里面,结果就正常:
3 1 2 3
3
4 2 3 4 5
15
3 1 2 3
3
4 2 3 4 5
15
原因:总之就是放外面就只初始化一次顺序表,放里面就每次都重新初始化一次顺序表
放while外面:
- 顺序表
sl
只初始化一次,但while
循环会多次运行。 - 每次循环结束后,
sl
的数据没有被清空,而是继续累积。 - 例如:
- 第一次输入
3 1 2 3
,sl
存储[1,2,3]
,计算z=1 * 3=3
。 - 第二次输入
4 2 3 4 5
,sl
变成[1,2,3,2,3,4,5]
(因为insertSequlist
是在原有数据后追加),计算z=1 * 3 * 3 * 5=45
。 - 第三次输入
3 1 2 3
,sl
变成[1,2,3,2,3,4,5,1,2,3]
,计算z=1 * 3 * 3 * 5 * 1 * 3=135
。 - 以此类推,
z
会越来越大。
- 第一次输入
放while里面:
- 每次循环都会重新初始化
sl
,所以数据不会累积。 - 例如:
- 第一次输入
3 1 2 3
,sl
存储[1,2,3]
,计算z=1 * 3=3
。 - 第二次输入
4 2 3 4 5
,sl
存储[2,3,4,5]
,计算z=3 * 5=15
。 - 第三次输入
3 1 2 3
,sl
存储[1,2,3]
,计算z=1 * 3=3
。 - 以此类推,每次计算都是基于当前输入的数据。
- 第一次输入