Lab4:数据处理方法及创新应用(创新)

1.水仙花数

image

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
	int cnt=0;
	for(int i=100;i<=999;i++)
	{
		int tmp=i,sum=0;
		while(tmp)
		{
			int x=tmp%10;
			tmp/=10;
			sum+=x*x*x;
		}
		if(sum==i)
		{
			cnt++;
			cout<<i<<endl;
		}
	}
	cout<<"水仙花数有"<<cnt<<"个"; 
	return 0;
}

输出

image

2

image

两种排序方法我写在一个代码的两个函数里面了

冒泡排序

每次比较相邻元素,把较小的放在前面。这样下去每一轮会把最大的元素放在序列末尾,重复 \(n\) 次操作即可。复杂度 \(O(n^2)\)

选择排序

每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,这样每次操作后待排序序列长度都 -1,重复 \(n\) 次操作即可。复杂度 \(O(n^2)\)
不过实际上,把当前待排序序列首位的元素和之后元素都比较一下,如果比后面的元素大就交换一下,就能实现这种效果,不需要记录最小元素的位置。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
inline ll read()
{
	ll ret=0;char ch=' ',c=getchar();
	while(!(c>='0'&&c<='9')) ch=c,c=getchar();
	while(c>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
	return ch=='-'?-ret:ret;
}
int a[15],b[15];
void bubble_sort()
{
	for(int i=1;i<=10;i++)	
		for(int j=1;j<=10-i;j++)
			if(a[j+1]<a[j]) swap(a[j+1],a[j]);
	for(int i=1;i<=10;i++) printf("%d ",a[i]);
	puts("");
}
void select_sort()
{
	for(int i=1;i<=10;i++)
		for(int j=i+1;j<=10;j++)	
			if(b[i]>b[j]) swap(b[i],b[j]);
	for(int i=1;i<=10;i++) printf("%d ",b[i]);
	puts("");
}
int main()
{
	for(int i=1;i<=10;i++) a[i]=read(),b[i]=a[i];
	bubble_sort();
	select_sort();
	return 0;
}

输出

image

3

image
刚学的时候这个题可能比较棘手,但现在来看用函数一层一层输出即可。
边界的处理需要稍微注意一下

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
inline ll read()
{
	ll ret=0;char ch=' ',c=getchar();
	while(!(c>='0'&&c<='9')) ch=c,c=getchar();
	while(c>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
	return ch=='-'?-ret:ret;
}
int n,a[102][102]; 
void work(int m,int len,int num)
{
	if(len<=0) return;
	for(int i=1;i<=len;i++) a[m][i+m-1]=++num;
	for(int i=1;i<=len-1;i++) a[m+i][m+len-1]=++num;
	for(int i=1;i<=len-1;i++) a[m+len-1][m+len-1-i]=++num;
	for(int i=1;i<=len-2;i++) a[m+len-1-i][m]=++num;
	//printf("m=%d,len=%d,num=%d\n",m,len,num);
	work(m+1,n-2*m,num); //边界处要稍微考虑一下 
}
int main()
{
	n=read();
	work(1,n,0);
	for(int i=1;i<=n;i++)	
	{
		for(int j=1;j<=n;j++)	
			printf("%3d ",a[i][j]);
		puts(""); 
	}
		 
	return 0;
}

输出

image

4.单链表

image
上课觉得自己听懂了,自己写才发现一堆问题。。。
由于对指针语法,new,delete 不熟悉,出现了很多次访问越界,死循环等错误。。。
最后把delete全删了才输出正常
一些思考和调试写在代码注释里了(真的那个delete给我调了好久,刚才还不小心把博客删了破大防了)

代码

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int data;
	node *nxt;
};
node *head,*tail,*tmp;
int len; //链表长度 
void query_node()
{
	tmp=head;
	while(tmp!=NULL) 
	{
		cout<<tmp->data<<' ';
		tmp=tmp->nxt;
	}
}
void insert() //在cur后面插入新节点 
{//一般情况下cur通过遍历确定,在这里简化为 cur=tail的情况 
	
	tmp=new node;
	cin>>tmp->data;	
	
	if(tmp->nxt==NULL) printf("tmp->nxt:: NULL\n"); 
		
	if(!len) 
	{
		head=tmp;
		head->nxt=tail; //这里改了好几次!!! 
		len++;
		return;
	}
	len++;
	//if(cur->nxt!=NULL) tmp->nxt=cur->nxt; //如果cur不是尾节点 
	tail->data=tmp->data;
	tail->nxt=tmp;
	tail=tmp,tail->nxt=NULL;//cur是尾节点,那么tmp成为新的尾节点 	
	//printf("tail::%d\n",tail->data);
	//delete tmp;
}
int main()
{
	
	if(head==NULL) printf("head:: NULL\n");
	head=new node,tail=new node;
	if(head->nxt==NULL) printf("head->nxt:: NULL\n");
	if(tail->nxt==NULL) printf("tail->nxt:: NULL\n");
	for(int i=1;i<=5;i++) insert();
	query_node();
	//delete head,tail;
	return 0;
}
//1 2 3 4 5

输出

image

posted @ 2023-11-10 23:49  conprour  阅读(7)  评论(0编辑  收藏  举报