山东理工大学程序设计与基础 pta C语言 一维数组

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


C语言实验—最值

输入格式:

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

输出格式:

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

#include
int main()
{
    int num[10] = {0};
    int k = 0;
    int x = 0;
    int n;
    int i;
    int t;
    scanf("%d",&n);
    {
    for(i = 0; i < n; i++)
    {
        scanf("%d",&num[i]);
    }
    for(i = 0; i < n; i++)
    {
        if(num[i] > num[k])
        {
            k = i;
        }
        if(num[i] < num[x])
        {
            x = i;
        }
    }
    t = num[k];
    num[k] = num[n-1];
    num[n-1] = t;
    t = num[x];
    num[x] = num[0];
    num[0] = t;
    for(i = 0; i < n; i++)
    {
        if(i==0)
            printf("%d",num[i]);
        else
        printf(" %d",num[i]);
    }
    }
    return 0;

}

C语言实验-整数位

输入一个不多于5位的正整数,要求:
(1)求出它是几位数;
(2)分别输出每一位数字;
(3)按逆序输出各位数字。

输入格式:

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

输出格式:

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

#include 
#include 

int main()
{
    int i, n, j, a[5];
    scanf("%d", &n);
    for(i = 0; n > 0; i++)
    {
        a[i] = n % 10;
        n = n / 10;
    }
    printf("%d\n", i);
    for(j = i; j > 0; j--)
    {
        if(j == 1)
        {
            printf("%d", a[j - 1]);
        }
        else
        {
            printf("%d ", a[j - 1]);
        }
    }
    printf("\n");
    for(j = 0; j < i; j++)
    {
        if(j == i - 1)
        {
            printf("%d", a[j]);
        }
        else
        {
            printf("%d ", a[j]);
        }
    }
    printf("\n");
    return 0;
}

C语言实验-区间之和

给定一个由 n 个整数组成的序列A1,A2,……, An 和两个整数L,R,你的任务是写一个程序来计算序列号在L,R 这段位置区间内所有数的总和。

输入格式:

输入只有一组测试数据:

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

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

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

输出格式:

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


#include
int main()
{
    int n;
    scanf("%d",&n);
    int a[n],L,R;
    for(int i=0;i

C语言实验-分割整数

从键盘输入一个长整数(不超过10位),从高位开始逐位分割并输出。

输入格式:

正整数n,不含前导零。

输出格式:

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

#include  
int main()  
{  
    long n;  
    int a[10],i,j; 
    scanf("%ld",&n);  
    for(i=0;i<10;i++)  
    {  
        a[i]=n%10;  
        n/=10;  
        if(n==0)
            break;  
    }  
    for(j=i;j>=0;j--)  
    {  
        if(j==0)  
            printf("%d\n",a[j]);
 
        else  
            printf("%d ",a[j]);  
    }  
    return 0;  
}

C语言实验-众数

众数是指在一组数据中,出现次数最多的数。例如:1, 1, 3 中出现次数最多的数为 1,则众数为 1。

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

输入格式:

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

对于每组数据:

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

输出格式:

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

数据保证有唯一的众数。


#include 
int main()
{
    int a, n;
    int i, k;
    while (~scanf("%d", &n))
    {
        int b[1001] = { 0 }, max = 0;
        for (i = 0; i < n; i++)
        {
            scanf("%d", &a);
            b[a]++;

        }
        for (i = 0; i <= 1000; i++)
        {
            if (b[i] > max)
            {
             max = b[i];
             k = i;
            }
        }
        printf("%d\n", k);
    }
    return 0;
}



C语言实验-数日子

时间如白驹过隙,大一的时光也是转眼就结束,因此要抓住每一寸光阴提升自己。你知道今天是这一年第几天吗,掐指一算还是要算好久,呵呵还是让计算机来做吧。这里的问题就是让你来写一个程序,输入某年某月某日,判断这一天是这一年的第几天?

输入格式:

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

输出格式:

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


#include 
int main()
{
    int n, j, y, m, d, sum, i, a[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    scanf("%d", &n);
    for(j = 0; j < n; j++)
    {
        scanf("%d %d %d", &y, &m, &d);
        sum = d;
        for(i = 0; i < m - 1; i++)
        {
            sum = sum + a[i];
        }
        if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
        {
            if(m == 1||(m == 2 && d != 29))
            {
                printf("%d\n", sum);
            }
            else
            {
                printf("%d\n", sum + 1);
            }
        }
        else
        {
            printf("%d\n", sum);
        }
    }
    return 0;
}

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

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

输入格式:

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

输出格式:

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


#include

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;
}

C语言实验- 排序

给你N(N<=100)个数,请你按照从小到大的顺序输出。

输入格式:

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

输出格式:

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


#include
int main()
{
    int n,a[100],i,j,temp;
    scanf("%d\n",&n);
    int k;
    for(i=0;ia[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }for(k=0;k


C语言实验-排序问题

输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。

输入格式:

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

输出格式:

输出数据有两行,第一行为排序

后的序列,第二行为排序后各个元素在原来序列中的位置。


#include 

int main()
{
    int a[10], b[10] = {1,2,3,4,5,6,7,8,9,10,7};
    int i, j;
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);
    for (i = 0; i < 9; i++)
    {
        for (j = 0; j < 9 - i; j++)
            if (a[j] > a[j + 1])
            {
                int t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
                t = b[j];
                b[j] = b[j + 1];
                b[j + 1] = t;
            }
    }
    for (i = 0; i < 10; i++)
    {
        if (i == 9)
            printf("%d\n", a[i]);
        else
            printf("%d ", a[i]);
    }
    for (i = 0; i < 10; i++)
    {
        if (i == 9)
            printf("%d\n", b[i]);
        else
            printf("%d ", b[i]);
    }

    return 0;
}


 


C语言实验- 数列有序!

有n(n<=100)个整数,已经按照从大到小顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。

输入格式:

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

输出格式:

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


#include

int main()
{
    int m,n,i,j;
    int a[100]={0};
    while(scanf("%d %d\n",&n,&m)!=EOF)
    {
        if (n==0 && m==0)
            return 0;
        else

        {    for(i=0;ia[i+1]&&m=i+2;j--)
                    {
                        a[j]=a[j-1];
                    }
                    a[i+1]=m;
                }
            }
        for(j=0;j

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 
int main()
{
    int n, a[1000];
    int i, j, k, t;
    int temp;
    double av, sum;
    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])
                {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1]=temp;
                }
            }
        }
        if (n % 2 != 0)
            av = a[((n + 1) / 2) - 1];
        else
        {
            sum = (a[n / 2] + a[(n / 2) - 1]);
            av = sum / 2;
        }

        printf("%.1lf\n", av);

    }

    return 0;
}

各位数字之和排序

这个题仅供参考 

给定n个正整数,根据各位数字之和从小到大进行排序。

输入格式:

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

输出格式:

输出每组排序的结果。


#include 
int main()
{
    int n,i,j,q,t;
    while(scanf("%d",&n),n)
    {
        int a[n];
        int sum[n];
        for(i=0; isum[j+1])
                {
                    t=sum[j];
                    sum[j]=sum[j+1];
                    sum[j+1]=t;
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
                else if(sum[j]==sum[j+1])
                {
                    if(a[j]>a[j+1])
                    {
                        t=a[j];
                        a[j]=a[j+1];
                        a[j+1]=t;
                    }
                }
             }
        for(i=0; i

冒泡排序中数据交换的次数

听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。

输入格式:

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

输出格式:

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


#include 
int main()
{
    int t, n, a[10], i, j, x;
    int t0, count = 0;
    scanf("%d", &t);
    for (i = 1; i <= t; i++)
    {
        count = 0;
        scanf("%d", &n);
        for (j = 0; j < n; j++)
        {
            scanf("%d", &a[j]);

        }
        for (j = 0; j <= n - 2; j++)
     
        {

            for (x = 0; x <= n - j - 2; x++)
            {
                if (a[x] > a[x + 1])
                {
                    t0 = a[x];
                    a[x] = a[x + 1];
                    a[x + 1] = t0;
                    count++;
                }
            }
        }
        printf("%d\n", count);

    }

    return 0;
}

 冒泡法排序之过程

本题要求使用选择法排序,将给定的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
int main()
{
    int n, i, j, temp = 0;
    int a[10] = { 0 };
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    if (n == 1)
    {
        printf("%d", a[0]);
    }
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1 - i; j++)
        {
            if (a[j] > a[j + 1])
            {
                temp = a[j + 1];
                a[j + 1] = a[j];
                a[j] = temp;
            }
        }
        for (int i = 0; i < n; i++)
        {
            if (i == 0)
                printf("%d", a[i]);
            else
                printf(" %d", a[i]);
            if (i == n - 1)
                printf("\n");
        }

    }
    return 0;
}


选择法排序之过程

本题要求使用选择法排序,将给定的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
int main()
{
    int n,i,j,k,temp,p=0;
    scanf("%d\n",&n);
    int a[11];
    for(i=0;ia[j])
                k=j;
        }
        temp=a[k];
        a[k]=a[i];
        a[i]=temp;
        for(p=0;p

数组逆序(数组移位)

有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。

输入格式:

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

输出格式:

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


#include
int main()
{
    int m,a[100],i,t,n,j;
    scanf("%d",&m); 
     
    for(i=0;i0)
    {
       t=a[m];
       for(j=m;j>=1;j--)
          a[j]=a[j-1];
       a[0]=a[m];n--;
    }
    for(i=0;i

矩阵输出(数组移位)

输入N个整数,输出由这些整数组成的n行矩阵。

输入格式:

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

输出格式:

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


#include 
int main()
{
    int n,a[30];
    int i,j,t;
    scanf("%d",&n);
    for(i=0; i=0; i--)
        {
            a[i]=a[i-1];
        }
        a[0]=t;
    }
     return 0;
}

阅览室

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

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

输入格式:

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

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

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

输出格式:

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

#include 
int main()
{
    int x,y,z,i,j;
    char a[5];
    int sum=0,s=0,n,b[1005];
    scanf("%d",&n);
    for(i=0;i<1005;i++)
    b[i]=-1;
    for(j=1;j<=n;j++)
    {
        while(6)
        {
            scanf("%d %s %d:%d",&x,a,&y,&z);
            if(x==0)
            {
                if(s!=0)
                    printf("%d %0.0f\n",s,(double)sum/s);
                else
                    printf("0 0\n");
                sum=0;
                s=0;
                break;
            }
            else
            {
                if(a[0]=='S')
                    b[x]=y*60+z;
                else if(a[0]=='E'&&b[x]!=-1)
                {
                    s++;
                    sum=sum+y*60+z-b[x] ;
                    b[x]=-1;
                }
            }
        }
    }
    return 0;
}

田忌赛马

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

输入格式:

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

输出格式:

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


#include 
int main()
{
	int t;
    int a[105], b[105];
	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 = 0; i <= n-1; i++)
		{
			for (j = 0; j <= n - i-1; j++)
			{
				if (a[j] > a[j + 1])
				{
					m = a[j];
					a[j] = a[j + 1];
					a[j + 1] = m;
				}
			}
		}
		for (i = 0; i <= n-1; i++)
		{
			for (j = 0; j <= n-1 - i; j++)
			{
				if (b[j] > b[j + 1])
				{
					m = b[j];
					b[j] = b[j + 1];
					b[j + 1] = m;
				}
			}
		}

		for (i = 1, j = 1; i <= n && j <= n;)
		{
			if (a[i] > b[j]) 
			{
				i++;
				j++;
				cnt++;
			}
			else
				i++; 
		}

		printf("%d\n", (cnt * 2 - n) * 200);
	}
}

提示:冒泡 选择排序法 可以在b站搜索,有详细教程,所用代码同上。


你可能感兴趣的:(c语言)