PTA习题 数组编程与实现(二) 代码

目录

7-1 简化的插入排序

7-2 查找整数

7-3 数字加密

7-4 求整数序列中出现次数最多的数

7-5 输出数组元素

7-6 判断题

7-7 求集合数据的均方差


7-1 简化的插入排序

本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。

输入格式:

输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。

输出格式:

在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。

输入样例:

5
1 2 4 5 7
3

输出样例:

1 2 3 4 5 7 

代码:

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int cmp( void const *a, void const *b){
    return (*(int*)a) - (*(int*)b);
}
int main()
{	
	int n, num, i;
    scanf("%d", &n);
    int arr[n + 1];
    for ( i = 0; i < n; i++)
        scanf("%d", &arr[i]);
	scanf("%d", &arr[i]);
    qsort(arr, n + 1, sizeof(arr[0]), cmp);
    for ( i = 0; i < n + 1; i++)
        printf("%d ", arr[i]);
	return 0;
} 

7-2 查找整数

本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。

输入格式:

输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。

输出格式:

在一行中输出X的位置,或者“Not Found”。

输入样例1:

5 7
3 5 7 1 9

输出样例1:

2

输入样例2:

5 7
3 5 8 1 9

输出样例2:

Not Found

代码:

#include <stdio.h>
int main()
{
    int n,x,i,index=0,c=0;
    scanf("%d %d",&n,&x);
    int a[n];
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
     for(i=0;i<n;i++)
     {
       if(a[i]==x)
        {
            index=i;
            c++;
            break;
        }
     }
    if(c==1)
         printf("%d",index);
    else
         printf("Not Found");
    return 0;
}

7-3 数字加密

输入一个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将千位和十位上的数字互换,百位和个位上的数字互换,组成加密后的新四位数。例如输入1257,经过加9取余后得到新数字0146,再经过两次换位后得到4601。

输入格式:

输入在一行中给出一个四位的整数x,即要求被加密的数。

输出格式:

在一行中按照格式“The encrypted number is V”输出加密后得到的新数V。

输入样例:

1257

输出样例:

The encrypted number is 4601

代码:

#include<stdio.h>
#define N 4
int main()
{
	int i = 3, x;
	int a[N];
	int temp;
	scanf("%d", &x);
	while (i != -1) 
	{
		a[i] = x % 10;
		x = x / 10;
		i--;
	}
	for (i = 0; i < N; i++)
		a[i] = a[i] + 9;
	for (i = 0; i < N; i++)
		a[i] = a[i] % 10;
	for (i = 0; i < 2; i++)
	{
		temp = a[i];
		a[i] = a[i + 2];
		a[i + 2] = temp;
	}
	printf("The encrypted number is ");
	for (i = 0; i < N; i++)
		printf("%d", a[i]);
	return 0;
}

7-4 求整数序列中出现次数最多的数

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入格式:

输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。

输出格式:

在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。

输入样例:

10 3 2 -1 5 3 4 3 0 3 2

输出样例:

3 4

代码:

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a[n],b[n];
    int i,j,k,l;
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        b[i]=1;
    }

    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(a[j]==a[i])  b[i]++;
        }
    }
    int max=0,max_num=0;
    for(k=0;k<n;k++)
    {
        if(b[k]>max)
        {
            max=b[k]-1;
            max_num=a[k];
        }

    }
     printf("%d %d",max_num,max);
}

7-5 输出数组元素

本题要求编写程序,对顺序读入的n个整数,顺次计算后项减前项之差,并按每行三个元素的格式输出结果。

输入格式:

输入的第一行给出正整数n(1<n≤10)。随后一行给出n个整数,其间以空格分隔。

输出格式:

顺次计算后项减前项之差,并按每行三个元素的格式输出结果。数字间空一格,行末不得有多余空格。

输入样例:

10
5 1 7 14 6 36 4 28 50 100

输出样例:

-4 6 7
-8 30 -32
24 22 50

代码:

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

7-6 判断题

判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分。

输入格式:

输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人数和判断题数量。第二行给出 M 个不超过 5 的正整数,是每道题的满分值。第三行给出每道题对应的正确答案,0 代表“非”,1 代表“是”。随后 N 行,每行给出一个学生的解答。数字间均以空格分隔。

输出格式:

按照输入的顺序输出每个学生的得分,每个分数占一行。

输入样例:

3 6
2 1 3 3 4 5
0 0 1 0 1 1
0 1 1 0 0 1
1 0 1 0 1 0
1 1 0 0 1 1

输出样例:

13
11
12

代码:

#include<stdio.h>
int main()
{
    int n, m;//n、m分别是学生人数和判断题数量
    scanf("%d %d", &n, &m);
    int c[100], k[100], b[100];
    int i = 0;
    int p = m;//为了保留原来m的值
    while (m > 0)
    {
        int z;
        scanf("%d", &z);
        c[i++] = z;//每题的得分
        m--;
    }
    m = p;
    i = 0;//恢复m、i的值
    while (m > 0)
    {
        int z;
        scanf("%d", &z);
        b[i++] = z;//每题的答案
        m--;
    }
    int q = 0;
    while (n > 0)
    { 
        m = p;
        int y = 0;//表示得分
        int u = 0;
        while (m > 0)
        {
            int z;
            scanf("%d",&z);
            if (z == b[u])
                y += c[u++];
            else
                y += 0*c[u++];
              m--;
        }
        k[q++] = y;//统计学生的得分
        n--;
    }
    for (int i1 = 0; i1 < q; i1++)
        printf("%d\n", k[i1]);
    return 0;
}

7-7 求集合数据的均方差

设计函数求 N 个给定整数的均方差。若将 N 个数 A[ ] 的平均值记为 Avg,则均方差计算公式为:[(A1​−Avg)2+(A2​−Avg)2+⋯+(AN​−Avg)2]/N​。

输入格式:

输入首先在第一行给出一个正整数 N(≤104),随后一行给出 N 个正整数。所有数字都不超过 1000,同行数字以空格分隔。

输出格式:

输出这N个数的均方差,要求固定精度输出小数点后5位。

输入样例 1:

10
6 3 7 1 4 8 2 9 11 5

输出样例 1:

3.03974

输入样例 2:

1
2

输出样例 2:

0.00000

代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{

    int n,i,a[10000];
    double avage,sum = 0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    avage = sum/n;
    sum = 0;
    for(i=0;i<n;i++)
    {
        sum += pow(a[i]-avage,2.0);
    }
    avage = sum/n;
    printf("%.5lf\n",sqrt(avage));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

渔梧

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

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

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

打赏作者

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

抵扣说明:

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

余额充值