Lab4:数据处理方法及创新应用(创新)
1.水仙花数
代码
#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;
}
输出
2
两种排序方法我写在一个代码的两个函数里面了
冒泡排序
每次比较相邻元素,把较小的放在前面。这样下去每一轮会把最大的元素放在序列末尾,重复 \(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;
}
输出
3
刚学的时候这个题可能比较棘手,但现在来看用函数一层一层输出即可。
边界的处理需要稍微注意一下
代码
#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;
}
输出
4.单链表
上课觉得自己听懂了,自己写才发现一堆问题。。。
由于对指针语法,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