2022山东理工大学pta程序设计---实验五(一维数组)代码

7-1 sdut- C语言实验—最值

有一个长度为n的整数序列,其中最大值和最小值不会出现在序列的第一和最后一个位置。
请写一个程序,把序列中的最小值与第一个数交换,最大值与最后一个数交换。输出转换好的序列。

输入格式:
输入包括两行。
第一行为正整数n(1≤n≤10)。
第二行为n个正整数组成的序列。

输出格式:
输出转换好的序列。数据之间用空格隔开。

输入样例:
6
2 3 8 1 4 5
输出样例:
1 3 5 2 4 8

#include <stdio.h>

int q[100];

int main()
{
    int n;
    scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {
        scanf("%d", &q[i]);
    }

    int max = -1, min = 0x3f3f3f3f;
    int max_no = 0, min_no = 0;
    for (int i = 0; i < n; i++)
    {
        if (q[i] > max)
        {
            max = q[i];
            max_no = i;
        }
        if (q[i] < min)
        {
            min = q[i];
            min_no = i;
        }
    }

    int t = q[0];
    q[0] = q[min_no];
    q[min_no] = t;

    t = q[n - 1];
    q[n - 1] = q[max_no];
    q[max_no] = t;

    for (int i = 0; i < n; i++)
    {
        if (i < n - 1) printf("%d ", q[i]);
        else printf("%d", q[i]);
    }
    return 0;
}

7-2 sdut-C语言实验-整数位

分数 12
作者 马新娟
单位 山东理工大学
输入一个不多于5位的正整数,要求:
(1)求出它是几位数;
(2)分别输出每一位数字;
(3)按逆序输出各位数字。

输入格式:
输入一个不多于5位的正整数。

输出格式:
输出数据有3行,第一行为正整数位数,第二行为各位数字,第三行为逆序的各位数字。

输入样例:
123
输出样例:
3
1 2 3
3 2 1

#include <stdio.h>
#include <string.h>

char q[10];
int main()
{
	scanf("%s", q);

	printf("%d\n", strlen(q));

	int f = 0;
	for (int i = 0; i < strlen(q); i++)
	{
		if (f) printf(" ");
		f = 1;
		printf("%c", q[i]);
	}
	printf("\n");
	f = 0;
	for (int i = strlen(q) - 1; i >= 0; i--)
	{
		if (f) printf(" ");
		f = 1;
		printf("%c", q[i]);
	}

	return 0;
}

7-3 sdut-C语言实验-区间之和

分数 10
作者 马新娟
单位 山东理工大学
给定一个由 n 个整数组成的序列A1,A2,……, An 和两个整数L,R,你的任务是写一个程序来计算序列号在L,R 这段位置区间内所有数的总和。

输入格式:
输入只有一组测试数据:

测试数据的第一行为一个整数 n (1< n < 10000);

第二行为 n 个 int 类型的整数;

第三行为两个整数 L,R(0 < L < R <= n)。

输出格式:
输出序列号在区间[L,R]内所有数的和,数据保证和在 int 类型范围内。

输入样例:
5
3 5 6 2 9
2 4
输出样例:
13

#include<stdio.h>
int main()
{
 int n;
 scanf("%d",&n);
 int a[n],L,R;
 for(int i=0;i<n;i++)
 {
  scanf("%d",&a[i]);
 }
 scanf("%d %d",&L,&R);
 int sum=0;
 for(int i=L-1;i<R;i++)
 {
  sum+=a[i];
 }
 printf("%d\n",sum);
   return 0;
 }

7-4 sdut-C语言实验-分割整数

分数 10
作者 马新娟
单位 山东理工大学
从键盘输入一个长整数(不超过10位),从高位开始逐位分割并输出。

输入格式:
正整数n,不含前导零。

输出格式:
分割的整数序列,各整数之间用空格格开。
注意,最后一个数字后面没有空格!

输入样例:
678123
输出样例:
在这里给出相应的输出。例如:

6 7 8 1 2 3

#include<stdio.h>
int main()
{
    long long int num,sum=0,n,i=0;

    scanf("%lld",&num);

    n=num;

    while (n>0)
    {
        n=n/10;
        sum++;
    }

    int a[sum];

    for(i=0;i<sum;i++)
    {
        a[i]=num%10;
        num=num/10;
    }

    for(i=sum-1;i>=0;i--)
    {
        if (i==sum-1)
        {
            printf("%d",a[sum-1]);
        }
        else
        {
        printf(" %d",a[i]);
        }
    }

    printf("\n");
    
    return 0;
}

7-5 sdut-C语言实验-众数

分数 14
作者 马新娟
单位 山东理工大学
众数是指在一组数据中,出现次数最多的数。例如:1, 1, 3 中出现次数最多的数为 1,则众数为 1。

给定一组数,你能求出众数吗?

输入格式:
输入数据有多组(数据组数不超过 50),到 EOF 结束。

对于每组数据:

第 1 行输入一个整数 n (1 <= n <= 10000),表示数的个数。
第 2 行输入 n 个用空格隔开的整数 Ai (0 <= Ai <= 1000),依次表示每一个数。

输出格式:
对于每组数据,在一行中输出一个整数,表示这组数据的众数。

数据保证有唯一的众数。

输入样例1:
3
1 1 3
输出样例1:
在这里给出相应的输出。例如:

1
输入样例1:
5
0 2 3 1 2
输出样例1:
在这里给出相应的输出。例如:

2

#include <stdio.h>

int main()
{
    int n, i, max;
    while(~scanf("%d", &n))
    {
        int Ai[n];
        memset(Ai, 0, sizeof(Ai));
        for(i = 0; i < n; i++)
        {
            scanf("%d", &Ai[i]);

        }
        int count[10001] = {0};
        for(i = 0; i < n; i++)
        {
            count[Ai[i]]++;
    
        }
        max = 0;
        int answer = 0;
      
        for(i = 0; i < n; i++)
        {
            if(max < count[Ai[i]])
            {
                max = count[Ai[i]];
                
                answer = Ai[i];
               
            }
        }
        printf("%d\n", answer);
    }
    return 0;

}

7-6 sdut- C语言实验-数日子

分数 12
作者 马新娟
单位 山东理工大学
光阴似箭,日月如梭,大学的时间真是宝贵,要抓紧时间AC。你知道今天是这一年第几天吗,掐指一算还是要算好久,呵呵还是让计算机来做吧。这里的问题就是让你来写一个程序,输入某年某月某日,判断这一天是这一年的第几天?

输入格式:
输入第一行是数据的组数n<100,下面n行是n组数据,每组数据由3个正整数组成,分别为年、月、日,我们保证每组数据都是有效的日期。

输出格式:
输出所输入的日期是这一年的第几天。

输入样例:
2
2009 1 1
2008 1 3
输出样例:
1
3

#include<stdio.h>
int main()
{
  int n,y,r,a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
  int x,i;
  int he;
  scanf("%d",&x);
  while(x--)
  {
    scanf("%d %d %d",&n,&y,&r);
    if((n%4==0&&n%100!=0)||n%400==0)  //判断闰年平年
    a[2] = 29;
    else
    a[2] = 28;
    he = 0;
    for(i=0;i<y;i++)
    he += a[i];
    he += r;
    printf("%d\n",he);
  }
  return 0;
}

7-7 去掉重复的数据

单位 浙江大学
在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。

你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,去掉所有重复的数字。最后按照输入顺序输出没有重复数字的数据。所有重复的数字只保留第一次出现的那份。

输入格式:
你的程序首先会读到一个正整数 n,1≤n≤100000。
然后是 n 个整数,这些整数的范围是 [1, 100000]。

输出格式:
在一行中按照输入顺序输出去除重复之后的数据。每两个数据之间有一个空格,行首尾不得有多余空格。

输入样例:
5
1 2 2 1 4
输出样例:
1 2 4

#include<stdio.h>
int main()
{
    int n,i=1;
    scanf("%d",&n);
    int k,judge[100001]={0};//这里的k取代了NUM【】数组 
    scanf("%d",&k);
    printf("%d",k);
    judge[k]++;    
    while(i<n)
    {
        scanf("%d",&k);  
        if(judge[k]==0)
        {
            printf(" %d",k);
            judge[k]++;
        }
        i++;
    }
    printf("\n");
}

7-8 求一批整数中出现最多的个位数字

给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。

输入格式:
输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。

输出格式:
在一行中按格式“M: n1 n2 …”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。

输入样例:
3
1234 2345 3456
输出样例:
3: 3 4

//求一批整数中出现最多的个位数字
int main()
{
	int n = 0, number = 0;
	int arr[10] = { 0 };
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &number);
		if (number == 0)
		{
			arr[0]++;
		}
		while (number > 0)
		{
			arr[number % 10]++;
			number /= 10;
		}
	}
	int max = arr[0];
	for (int j = 0; j < 10; j++)
	{
		if (max < arr[j])
		{
			max = arr[j];
		}
	}
	printf("%d:", max);
 
	for (int k = 0; k < 10; k++)
	{
		if (max == arr[k])
		{
 
			printf(" %d", k);
		}
 
	}
 
	return 0;
}

7-9 sdut-C语言实验- 排序

分数 16
作者 马新娟
单位 山东理工大学
给你N(N<=100)个数,请你按照从小到大的顺序输出。

输入格式:
输入数据第一行是一个正整数N,第二行有N个整数。

输出格式:
输出一行,从小到大输出这N个数,中间用空格隔开。

输入样例:
5
1 4 3 2 5
输出样例:
1 2 3 4 5

#include<stdio.h>
int main()
{
    int n,a[101],flag;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=0; i<n-1; i++)
    {
        for(int j =i+1;j<n;j++)
        {
            if(a[i]>a[j])
            {
                flag = a[i];
                a[i] = a[j];
                a[j] = flag;
            }
        }
    }
    for(int i=0; i<n-1; i++)
    {
        printf("%d ",a[i]);
    }
    printf("%d\n",a[n-1]);
    return 0;
}

7-10 sdut-C语言实验-排序问题

分数 15
作者 马新娟
单位 山东理工大学
输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。

输入格式:
输入数据有一行,包含10个整数,用空格分开。

输出格式:
输出数据有两行,第一行为排序后的序列,第二行为排序后各个元素在原来序列中的位置。

输入样例:
1 2 3 5 4 6 8 9 10 7
输出样例:
在这里给出相应的输出。例如:

1 2 3 4 5 6 7 8 9 10
1 2 3 5 4 6 10 7 8 9

#include<stdio.h>
int main()
{
    int i,t,j;
    int n=10;
    int a[10],c[10];
    
    for (i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
        c[i]=i+1;
    }
    
    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;
                    
                    t = c[j];
                    c[j] = c[j+1];
                    c[j+1] = t;
                    
                }
            }

    }
    
    for (i=0; i<n; i++)
    {
        if (i==0)
        {
            printf("%d",a[0]);
        }
        else
            printf(" %d",a[i]);
    }
    
    printf("\n");
    
    for (i=0; i<n; i++)
    {
        if (i==0)
        {
            printf("%d",c[0]);
        }
        else
            printf(" %d",c[i]);
    }
    
    return 0;
}

7-11 sdut-C语言实验- 数列有序!

分数 14
作者 马新娟
单位 山东理工大学
有n(n<=100)个整数,已经按照从大到小顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。

输入格式:
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0表示输入数据的结束,本行不做处理。

输出格式:
对于每个测试实例,输出插入新的元素后的数列。

输入样例:
3 3
4 2 1
0 0
输出样例:
在这里给出相应的输出。例如:

4 3 2 1

#include <stdio.h>
int main()
{
    int m, n, a[100], i, j ,t;
    while ((scanf("%d %d",&n ,&m)!=EOF)&&(m!=0)&&(n!=0))
    {
        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语言实验- 中位数

分数 12
作者 马新娟
单位 山东理工大学
中位数是指在一组数据中,按数值大小排序后处于中间位置的数。例如: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 位小数),表示这组数据的中位数。

输入样例:
在这里给出一组输入。例如:

3
1 5 3
4
1 2 3 4
输出样例:
在这里给出相应的输出。例如:

3.0
2.5

#include <stdio.h>
int main()
{
    int i,j,t,n;

    double m;

    while (scanf("%d",&n)!=EOF)
    {
        int a[n];

        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=(double)(a[(n/2)-1]+a[(n/2)])/2;
            printf("%.1lf",m);
        }
        else
        {
            m=a[(n+1)/2-1];
            printf("%.1lf",m);
        }
        printf("\n");

    }
    return 0;
}

7-13 sdut-C语言实验-各位数字之和排序

分数 12
作者 马新娟
单位 山东理工大学
给定n个正整数,根据各位数字之和从小到大进行排序。

输入格式:
输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面接n个正整数。当n为0时,不作任何处理,输入结束。n<=10。

输出格式:
输出每组排序的结果。

输入样例:
3 230 59 110
5 199 220 108 235 120
0
输出样例:
在这里给出相应的输出。例如:

110 230 59
120 220 108 235 199

#include<stdio.h>
int main()
{
    int sum[10];
    int n;
    int i,j;
    int temp;
    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]);
            temp = a[i];
            for(j = 0; ; j++)
            {
                sum[i] += temp%10;
                temp = temp / 10;
                if(temp == 0)
                    break;
            }
        }
        for(i = 0; i < n - 1; i++)
        { 
            for(j = i + 1; j < n; j++)
            {
                if(sum[i] > sum[j])
                {
                    temp = sum[i];
                    sum[i] = sum[j];
                    sum[j] = temp;
                    temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }
        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语言实验- 冒泡排序中数据交换的次数

分数 18
作者 马新娟
单位 山东理工大学
听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。

输入格式:
输入数据的第一行为一个正整数 T ,表示有 T 组测试数据。
接下来T行,每行第一个整数N, 然后有N个整数,无序。0<N <= 100

输出格式:
输出共 T 行。
每行一个整数,代表本行数据从小到大冒泡排序所进行的交换次数

输入样例:
在这里给出一组输入。例如:

3
5 1 2 3 4 5
4 5 3 7 1
2 2 1
输出样例:
在这里给出相应的输出。例如:

0
4
1

#include<stdio.h>
int main()
{
    int n,i,j,t,count,T;

        scanf("%d", &T);
        while (T>0)
    {
            scanf("%d",&n);

            int a[n];

            for (i = 0; i < n; i++)
            {
                scanf("%d", &a[i]);
            }
    count=0;
            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;
                        count++;
                    }
                }
            }

            printf("%d\n",count);
            T--;
            }

    return 0;
}

7-15 冒泡法排序之过程

分数 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]的值,相邻数字间有一个空格,行末不得有多余空格。

输入样例:
5
8 7 6 0 1
输出样例:
7 6 0 1 8
6 0 1 7 8
0 1 6 7 8
0 1 6 7 8

#include<stdio.h>
#include<math.h>
int main (void){
int a[10],n,i,j,temp;
scanf("%d\n",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
if(n==1){
printf("%d",a[0]);
}
for(j=0;j<n-1;j++){ 
for(i=0;i<n-1-j;i++){
if(a[i]>a[i+1]){
temp=a[i+1];
a[i+1]=a[i];
a[i]=temp;
}
}
for(i=0;i<n;i++){
if(i==0)
printf("%d",a[i]);
else
printf(" %d",a[i]);
if(i==n-1)
printf("\n");
}
}
}

7-16 选择法排序之过程

分数 15
作者 颜晖
单位 浙大城市学院
本题要求使用选择法排序,将给定的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]的值,相邻数字间有一个空格,行末不得有多余空格。

输入样例:
4
5 1 7 6
输出样例:
1 5 7 6
1 5 7 6
1 5 6 7

#include<stdio.h>
int main (){
int a[100],i,k=0,n,index,temp,max,j,m;
scanf("%d\n",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
if(n==1){
printf("%d",a[0]);
return 0;
}
for(j=0;j<n-1;j++){
for(i=j;i<n;i++){
if(a[k]>a[i]){//由于要写出每一步的过程,所以不能取等,否则会导致错误!
k=i;
}
}
temp=a[k];a[k]=a[j];a[j]=temp;
for(m = 0;m<n;m++){
if(m==0)
printf("%d",a[m]);
else
printf(" %d",a[m]);
if(m==n-1)
printf("\n",a[m]); 
}
k=j+1;
}

}

7-17 sdut- C语言实验-数组逆序(数组移位)

分数 13
作者 马新娟
单位 山东理工大学
有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。

输入格式:
输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。

输出格式:
按先后顺序输出n个整数。

输入样例:
5 1 2 3 4 5
2
输出样例:
在这里给出相应的输出。例如:

4 5 1 2 3

#include<stdio.h>
int main()
{
    int n,m,t,i,t2,j;

    scanf("%d",&n);

    int a[n];

    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }

    scanf("%d",&m);
    
    for(i = 0; i < m;i++)
    {
        t = a[n-1];
        for(j = n - 1; j > 0; j--)
        {
            a[j] = a[j-1];
        }
        a[0] = t;
    }

    for (i=0; i<n; i++)
        {
            if (i==0)
            {
                printf("%d",a[0]);
            }
            else
                printf(" %d",a[i]);
        }
    printf("\n");

    return 0;
}

7-18 sdut-C语言实验-矩阵输出(数组移位)

分数 16
作者 马新娟
单位 山东理工大学
输入N个整数,输出由这些整数组成的n行矩阵。

输入格式:
第一行输入一个正整数N(N<=20),表示后面要输入的整数个数。
下面依次输入N个整数。

输出格式:
以输入的整数为基础,输出有规律的N行数据。

输入样例:
在这里给出一组输入。例如:

5
3 6 2 5 8
输出样例:
在这里给出相应的输出。例如:

3 6 2 5 8
8 3 6 2 5
5 8 3 6 2
2 5 8 3 6
6 2 5 8 3

#include<stdio.h>
int main()
{
    int n,i,j,t;

    scanf("%d",&n);
    int a[n];
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }

    for(i=0;i<n;i++)
    {
        if(i==0)
        {
            for (j = 0; j < n; j++)
            {
                if (j == 0)
                    printf("%d", a[j]);
                else
                    printf(" %d", a[j]);
            }
        }

        else
            {
            t = a[n - 1];

            for (j = n - 1; j > 0; j--)
            {
                a[j] = a[j - 1];
            }

            a[0] = t;


            for (j = 0; j < n; j++)
            {
                if(j==0)
                    printf("%d",a[j]);
                else
                    printf(" %d",a[j]);
            }
        }
            printf("\n");
    }

7-19 简版田忌赛马

分数 10
作者 usx程序设计类课程组
单位 绍兴文理学院
这是一个简版田忌赛马问题,具体如下:
田忌与齐王赛马,双方各有n匹马参赛,每场比赛赌注为200两黄金,现已知齐王与田忌的每匹马的速度,并且齐王肯定是按马的速度从快到慢出场,请写一个程序帮助田忌计算他最多赢多少两黄金(若输,则用负数表示)。
简单起见,保证2n匹马的速度均不相同。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试数据输入3行,第一行是n(1≤n≤100) ,表示双方参赛马的数量,第2行n个正整数,表示田忌的马的速度,第3行n个正整数,表示齐王的马的速度。

输出格式:
对于每组测试数据,输出一行,包含一个整数,表示田忌最多赢多少两黄金。

输入样例:
4
3
92 83 71
95 87 74
2
20 25
21 12
10
1 2 3 24 5 6 7 8 9 12
11 13 15 19 22 34 14 21 44 99
4
10 15 16 37
14 20 30 40
输出样例:
200
400
-1200
0

#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 阅览室

分数 20
作者 陈越
单位 浙江大学
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。

注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。

输入格式:
输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:

书号([1, 1000]内的整数) 键值(S或E) 发生时间(hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)

每一天的纪录保证按时间递增的顺序给出。

输出格式:
对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。

输入样例:
3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00
输出样例:
2 196
0 0
1 60

#include <stdio.h>
#include <string.h>
struct book
{
	int status;//当前状态:借出1 还回0。 
	int time; 
}b[1005];//存每本书的数据 

int main()
{
	int n;
	scanf("%d",&n);//天数 
	for(int i=0;i<n;i++)
	{
		memset(b,0,sizeof(struct book)*1005);
//		memset(t,0,sizeof(int)*1005); 
		int count=0; 
		int a,c,d;
		char f;
		double sum=0;
		while(1)
		{
			scanf("%d %c %d:%d",&a,&f,&c,&d);
			
			if(a==0)
			{
				break;
			}
			else
			{
				if(/*b[a].status==0&&*/f=='S')
				/*如果没用注释掉这半句 会错一个样例,
				因为可能上一次是残缺的借还 只有借 没有还 
				但是在当天又开始了新一次的借书*/
				{
					b[a].status=1;
					b[a].time=c*60+d;
				}
				else if(b[a].status==1&&f=='E')
				{
					b[a].status=0;
					//此处还原借还状态也是为了避免当天又有人借这本书的情况。
					b[a].time=c*60+d-b[a].time;	
					count++;
					sum+=b[a].time;
				} 
			}
			
		}
		/*double sum=0; 
		for(int i=0;i<count;i++)
		{
			sum+=t[i];
		}*/
		if(count==0||sum==0)
		{
			printf("0 0\n");
		}
		else
		{
			printf("%d %.0f\n",count,sum/count);	
		}
		
	}
	return 0;
 } 


评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.又是新的一天.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值