数据结构-顺序表-求基数乘积

发布于:2025-06-21 ⋅ 阅读:(13) ⋅ 点赞:(0)

题目:

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 3sl 存储 [1,2,3],计算 z=1 * 3=3
    • 第二次输入 4 2 3 4 5sl 变成 [1,2,3,2,3,4,5](因为 insertSequlist 是在原有数据后追加),计算 z=1 * 3 * 3 * 5=45
    • 第三次输入 3 1 2 3sl 变成 [1,2,3,2,3,4,5,1,2,3],计算 z=1 * 3 * 3 * 5 * 1 * 3=135
    • 以此类推,z 会越来越大。

放while里面: 

  • 每次循环都会重新初始化 sl,所以数据不会累积。
  • 例如:
    • 第一次输入 3 1 2 3sl 存储 [1,2,3],计算 z=1 * 3=3
    • 第二次输入 4 2 3 4 5sl 存储 [2,3,4,5],计算 z=3 * 5=15
    • 第三次输入 3 1 2 3sl 存储 [1,2,3],计算 z=1 * 3=3
    • 以此类推,每次计算都是基于当前输入的数据。