7-11 sdut-C语言实验- 数列有序!
有n(n<=100)个整数,已经按照从大到小顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。
输入格式:
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0表示输入数据的结束,本行不做处理。
输出格式:
对于每个测试实例,输出插入新的元素后的数列。
#include<stdio.h>
int main(){
int a[101];
int n,m;
int i,j,t;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0)break;
for(i=0;i<n;i++)scanf("%d",&a[i]);
a[n]=m;
for(i=0;i<n;i++){
for(j=i+1;j<=n;j++){
if(a[i]<a[j]){
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<=n;i++){
if(i==n)printf("%d\n",a[i]);
else printf("%d ",a[i]);
}
}
return 0;
}
7-12 sdut-C语言实验- 中位数
中位数是指在一组数据中,按数值大小排序后处于中间位置的数。例如:1, 5, 3 排序后为 1, 3, 5,则其中位数为 3。特别地,当数的个数 N 为偶数时,中位数取位置居中的两个数 (N/2 和 N/2+1) 的平均值,例如:1, 2, 3, 4,中位数为 (2+3)/2 = 2.5。
给定一组数,你能求出中位数吗?
输入格式:
输入数据有多组(数据组数不超过 100),到 EOF 结束。
对于每组数据:
第 1 行输入一个整数 n (3 <= n <= 100),表示数的个数。
第 2 行输入 n 个用空格隔开的整数 Ai (0 <= Ai <= 1000),依次表示每一个数,保证互不重复。
输出格式:
对于每组数据,在一行中输出一个实数(保留 1 位小数),表示这组数据的中位数。
#include <stdio.h>
int main()
{
int i,j,t,n;
double m;int a[100];
while (scanf("%d",&n)!=EOF)
{
for (i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
for (i=0; i<n-1; i++)
{
for(j=0; j<n-1-i;j++)
{
if(a[j] > a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
if (n%2==0)
{
m=(a[(n/2)-1]+a[(n/2)])/2.0;
printf("%.1lf",m);
}
else
{
m=a[(n+1)/2-1];
printf("%.1lf",m);
}
printf("\n");
}
return 0;
}
7-13 sdut-C语言实验-各位数字之和排序
给定n个正整数,根据各位数字之和从小到大进行排序。
提示:用未改进的选择排序法。
输入格式:
输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面接n个正整数。当n为0时,不作任何处理,输入结束。n<=10。
输出格式:
输出每组排序的结果。
#include<stdio.h>
int main()
{
int sum[10];
int n,i,j,t;
int a[10];
while(~scanf("%d",&n)&&n){
for(i=0;i<n;i++){
sum[i]=0;
}
for(i=0;i<n;i++){
scanf("%d",&a[i]);
t=a[i];
for(j=0;;j++){
sum[i]+=t%10;
t=t/10;
if(t==0)break;
}
}
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(sum[i]>sum[j]){
t=sum[i];
sum[i]=sum[j];
sum[j]=t;
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<n;i++){
if(i==n-1)printf("%d\n",a[i]);
else printf("%d ",a[i]);
}
}
return 0;
}
7-14 sdut-C语言实验- 冒泡排序中数据交换的次数
听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。
输入格式:
输入数据的第一行为一个正整数 T ,表示有 T 组测试数据。
接下来T行,每行第一个整数N, 然后有N个整数,无序。0<N <= 100
输出格式:
输出共 T 行。
每行一个整数,代表本行数据从小到大冒泡排序所进行的交换次数
#include<stdio.h>
#include<stdlib.h>
int main()
{
int t,i,n,a,arr[101],j,sum,h;
scanf("%d",&t);
while(t--){
h=0;sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(arr[j]>arr[j+1]){
h=arr[j];
arr[j]=arr[j+1];
arr[j+1]=h;
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}
7-15 冒泡法排序之过程
本题要求使用冒泡法排序,将给定的n个整数从小到大排序后输出,并输出排序过程中每一步的中间结果。
冒泡排序的算法步骤描述如下:
第1步:在未排序的n个数(a[0]〜 a[n−1])中,从a[0]起,依次比较相邻的两个数,若邻接元素不符合次序要求,则对它们进行交换。本次操作后,数组中的最大元素“冒泡”到a[n−1];
第2步:在剩下未排序的n−1个数(a[0] 〜 a[n−2])中,从a[0]起,依次比较相邻的两个数,若邻接元素不符合次序要求,则对它们进行交换。本次操作后,a[0] 〜 a[n−2]中的最大元素“冒泡”到a[n−2];
……
第i步:在剩下未排序的n−k个数(a[0]〜a[n−i])中,从a[0]起,依次比较相邻的两个数,若邻接元素不符合次序要求,则对它们进行交换。本次操作后,a[0] 〜 a[n−i]中的最大元素“冒泡”到a[n−i];
……
第n−1步:在剩下未排序的2个数(a[0] 〜a[1])中,比较这两个数,若不符合次序要求,则对它们进行交换。本次操作后,a[0] 〜 a[1]中的最大元素“冒泡”到a[1]。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在每一行中输出排序过程中对应步骤的中间结果,即每一步后a[0]〜 a[n−1]的值,相邻数字间有一个空格,行末不得有多余空格。
#include<stdio.h>
int main()
{
int n,a[10],t,i,j;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
if(n==1)printf("%d\n",a[0]);
else {
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
for(int k=0;k<n;k++){
if(k==n-1)printf("%d\n",a[k]);
else printf("%d ",a[k]);
}
}
}
return 0;
}
7-16 选择法排序之过程
本题要求使用选择法排序,将给定的n个整数从小到大排序后输出,并输出排序过程中每一步的中间结果。
选择排序的算法步骤如下:
第0步:在未排序的n个数(a[0]〜 a[n−1])中找到最小数,将它与 a[0]交换;
第1步:在剩下未排序的n−1个数(a[1] 〜 a[n−1])中找到最小数,将它与 a[1] 交换;
……
第k步:在剩下未排序的n−k个数(a[k]〜a[n−1])中找到最小数,将它与 a[k] 交换;
……
第n−2步:在剩下未排序的2个数(a[n−2] 〜a[n−1])中找到最小数,将它与 a[n−2]交换。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在每一行中输出排序过程中对应步骤的中间结果,即每一步后a[0]〜 a[n−1]的值,相邻数字间有一个空格,行末不得有多余空格。
#include<stdio.h>
int main()
{
int a[15];int n,m,i,j;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int x;
if(n==1)printf("%d\n",a[0]);
else {
for(i=0;i<n-1;i++){
int k=i;
for(j=i+1;j<n;j++){
if(a[k]>a[j])k=j;
}
if(k!=i){
int t=a[k];a[k]=a[i];a[i]=t;
}
for(x=0;x<n;x++){
if(x==n-1)printf(" %d\n",a[x]);
else if(x==0)printf("%d",a[x]);
else printf(" %d",a[x]);
}
}
}
return 0;
}
7-17 sdut- C语言实验-数组逆序(数组移位)
有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。
输入格式:
输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。
输出格式:
按先后顺序输出n个整数。
#include<stdio.h>
int main()
{
int n,m,i,t,k;int a[101];
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(k=0;k<m;k++){
t=a[n-1];
for(i=n-1;i>0;i--){
a[i]=a[i-1];
}
a[i]=t;
}
for(i=0;i<n;i++){
if(i==n-1)printf("%d\n",a[i]);
else printf("%d ",a[i]);
}
return 0;
}
7-18 sdut-C语言实验-矩阵输出(数组移位)
输入N个整数,输出由这些整数组成的n行矩阵。
输入格式:
第一行输入一个正整数N(N<=20),表示后面要输入的整数个数。
下面依次输入N个整数。
输出格式:
以输入的整数为基础,输出有规律的N行数据。
#include<stdio.h>
int main()
{
int n,a[21];int i,j,k,t;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(k=0;k<n;k++){
for(i=0;i<n;i++){
if(i<n-1)printf("%d ",a[i]);
else printf("%d\n",a[i]);
}
t=a[n-1];
for(j=n-1;j>=1;j--){
a[j]=a[j-1];
}
a[0]=t;
}
return 0;
}
7-19 简版田忌赛马
这是一个简版田忌赛马问题,具体如下:
田忌与齐王赛马,双方各有n匹马参赛,每场比赛赌注为200两黄金,现已知齐王与田忌的每匹马的速度,并且齐王肯定是按马的速度从快到慢出场,请写一个程序帮助田忌计算他最多赢多少两黄金(若输,则用负数表示)。
简单起见,保证2n匹马的速度均不相同。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试数据输入3行,第一行是n(1≤n≤100) ,表示双方参赛马的数量,第2行n个正整数,表示田忌的马的速度,第3行n个正整数,表示齐王的马的速度。
输出格式:
对于每组测试数据,输出一行,包含一个整数,表示田忌最多赢多少两黄金。
#include <stdio.h>
int a[105], b[105];
int main()
{
int t;
scanf("%d", &t);
int i, j, k, n, m, cnt;
while (t--)
{
cnt = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (i = 1; i <= n; i++)
scanf("%d", &b[i]);
//两个都从小到大排序
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n - i; j++)
{
if (a[j] > a[j + 1])
{
m = a[j];
a[j] = a[j + 1];
a[j + 1] = m;
}
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n - i; j++)
{
if (b[j] > b[j + 1])
{
m = b[j];
b[j] = b[j + 1];
b[j + 1] = m;
}
}
}
// a田忌的,b齐王的
for (i = 1, j = 1; i <= n && j <= n;)
{
if (a[i] > b[j]) //这局赢了,田忌齐王都下一匹马
{
i++;
j++;
cnt++;
}
else
i++; //这匹马输了
}
//赢了cnt-(n-cnt)=cnt*2-n局
printf("%d\n", (cnt * 2 - n) * 200);
}
}
7-20 阅览室
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S
键,程序开始计时;当读者还书时,管理员输入书号并按下E
键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S
没有E
,或者只有E
没有S
的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
输入格式:
输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:
书号
([1, 1000]内的整数) 键值
(S
或E
) 发生时间
(hh:mm
,其中hh
是[0,23]内的整数,mm
是[0, 59]内整数)
每一天的纪录保证按时间递增的顺序给出。
输出格式:
对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。
#include <stdio.h>
int flag[1005],time[1005];
int main()
{
int hh,n,mm,i,j,a;
char op;
scanf("%d",&n);
while(n--)
{
double sum=0;
int k=0;
while(~scanf("%d %c %d:%d",&a,&op,&hh,&mm)&&a)
{
if(op=='S')
{
flag[a]=1;
time[a]=hh*60+mm;
}
else if(op=='E')
{
if(flag[a])
{
flag[a]=0;
k++;
sum=sum+hh*60+mm-time[a];
}
}
}
if(k==0)
printf("0 0\n");
else
printf("%d %.0lf\n",k,sum*1.0/k);}
return 0;}