数据结构-顺序表-求基数乘积
题目:
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
。 - 以此类推,每次计算都是基于当前输入的数据。
- 第一次输入