数据结构习题集作业代码(第一章)

这篇博客涵盖了多个算法的应用,包括三整数排序算法,k阶斐波那契数列的计算,田径对抗赛的分数统计以及一元多项式的求值。通过C语言实现,详细展示了如何解决这些计算问题。此外,还提供了处理表格数据和高效计算的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.16-三整数排序

Description
写一个算法,自大到小依次输出顺序读入的三个整数,x,y和z的值
Input
输入x,y和z
Output
输出自大到小的排序

#include<stdio.h>
void swap(int *x,int *y){
    int t=*x;
    *x=*y;
    *y=t;
}
int main(){
    int x,y,z;
    scanf("%d%d%d",&x,&y,&z);
    if(x<y)swap(&x,&y);
    if(y<z)swap(&y,&z);
    if(x<y)swap(&x,&y);
    printf("%d %d %d",x,y,z);
    return 0;
}

1.17-k阶斐波那契数列

Description
已知k阶斐波那契序列的定义为
在这里插入图片描述
试编写求k阶裴波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现。
Input
输入为k和m(m从0开始,f0f_0f0 对应m=0)
Output
输出第m项的值

#include<stdio.h>
/*int a[100][100],b[100][100],c[100][100],k,m;
void copy(int (*a)[100],int (*b)[100]);
void operate(int (*a)[100],int (*b)[100]){
    int i,j,l;
    int c[100][100];
    for(i=1;i<=k;++i){
        for(j=1;j<=k;++j){
            c[i][j]=0;
        }
    }
    for(i=1;i<=k;++i){
        for(j=1;j<=k;++j){
            for(l=1;l<=k;++l){
                c[i][j]+=a[i][l]*b[l][j];
            }
        }
    }
    copy(a,c);
}
void init(int (*a)[100]){
    int i,j;
    for(i=1;i<=k;++i){
        for(j=1;j<=k;++j){
            a[i][j]=0;
        }
    }
}
void copy(int (*a)[100],int (*b)[100]){
    int i,j;
    for(i=1;i<=k;++i){
        for(j=1;j<=k;++j){
            a[i][j]=b[i][j];
        }
    }
}
void power(int (*a)[100],int k){
    int tmp[100][100],i;
    init(tmp);
    for(i=1;i<=k;++i){
        tmp[i][i]=1;
    }
    while(k){
        if(k&1){
            operate(tmp,a);
        }
        operate(a,a);
        k>>=1;
    }
    copy(a,tmp);
}
int main(){
    scanf("%d%d",&k,&m);
    if(m<k){
        printf("0");
        return 0;
    }
    else{
        if(k==m){
            printf("1");
            return 0;
        }
    }
    init(a);
    a[1][k]=1;
    init(b);
    int i;
    for(i=1;i<=k-1;++i){
        b[i+1][i]=1;
    }
    for(i=1;i<=k;++i){
        b[i][k]=1;
    }
    power(b,m-k+1);
    operate(a,b);
    printf("%d",a[1][k]);
    return 0;
}*/
int a[100000]={},m,i,j,k;
int main(){
	scanf("%d%d",&k,&m);
	a[k-1]=1;
	for(i=k;i<=m;++i){
		for(j=i-k;j<i;++j){
			a[i]+=a[j]; 
		}
	}
	printf("%d",a[m]);
}

1.18-田径对抗赛

Description

假设有A,B,C,D,E 五个高等院校进行田径对抗赛,各院校的单项成绩均已存入计算机,并构成一张表,表中每一行的形式为

项目名称 - 性别 - 校名 - 成绩

编写算法,处理上述表格,以统计个院校的男、女总分和团体总分,并输出

Input
输入包含多行,每行代表表格中的一行,每个字段以空格分隔

M代表男生,F代表女生

Output
输出每个学校的男,女总分和团体总分,按如下顺序

第一行输出学校A的男生总分

第二行输出学校A的女生总分

第三行输出学校A的团体总分

第四行输出学校B的男生总分

如果某个学校没有男生或女生,则跳过对应的行数(如学校A没有女生,则跳过第二行)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char p,g,s;
int score,i;
int vis[5];
int S[6][3];
int main(){
	while(scanf("%c ",&p)!=EOF){
		scanf("%c %c %d\n",&g,&s,&score);
		vis[s-'A']=1;
		if(g=='M'){
			S[s-'A'][0]+=score;
		}
		else S[s-'A'][1]+=score;
	}
	for(i=0;i<5;++i){
		if(S[i][0]+S[i][1]==0)continue;
		if(S[i][0]!=0){
			printf("%c M %d\n",i+'A',S[i][0]);
		}
		if(S[i][1]!=0){
			printf("%c F %d\n",i+'A',S[i][1]);
		}
		printf("%c %d\n",i+'A',S[i][0]+S[i][1]);
	}
	return 0;
}

1.20-求一元多项式的值

Description

编写算法求一元多项式Pn(x0)=∑i=0naix0iP_n(x_0)=\sum_{i=0}^{n}a_ix_0^iPn(x0)=i=0naix0i

的值Pn(x0)P_n(x_0)Pn(x0)

Input
输入第一行为x0x_0x0和n,以空格分隔,n>=0n>=0n>=0
输入第二行为ai(i=0,1,...,n),−1000<=ai<=1000a_i(i=0,1,...,n),−1000<=a_i<=1000ai(i=0,1,...,n),1000<=ai<=1000以空格分隔

Output
输出Pn(x0)P_n(x_0)Pn(x0)的值

#include<stdio.h>
int Quick_Power(int x,int k){
	int ret=1;
	while(k){
		if(k&1){
			ret=ret*x;
		}
		x=x*x;
		k>>=1;
	}
	return ret;
}
int x0,n,i,sum=0;
int main(){
	scanf("%d%d",&x0,&n);
	for(i=0;i<=n;++i){
		int a;
		scanf("%d",&a);
		sum+=a*Quick_Power(x0,i);
	}
	printf("%d",sum);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值