PTA数组练习

7-4 排序(选择法)

问题:从键盘输入10个数,编程将其按从大到小的顺序排列后再输出。(使用选择法)

#include <stdio.h>

int main()
{
    int i, j, temp;
    int a[10] = {};

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

    for(i = 0; i < 9; i++)
    {
        for(j = i + 1; j < 10; j++)
        {
            if(a[i] < a[j])
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }

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

    return 0;
}

7-5 排序

问题:输入一批未排序的数据,数量不超过30个,请使用选择法或者冒泡法对其排序,并按照规定的要求输出。

#include <stdio.h>

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

    for(i = 0; i < n - 1; i++)
    {
        for(j = i + 1; j < n; j++)
        {
            if(a[i] < a[j])
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }

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

    printf("%d", a[n - 1]);
    return 0;
}

7-6 输出数组中最大值出现的次数

问题:定义长度为N的数组,为每个元素存入0~20的之间的随机数,输出最大值出现的次数。

#include <stdio.h>

int main()
{
    int n, i, count = 0;
    int a[100] ={};
    scanf("%d", &n);

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

    int max = a[0];
    for(i = 1; i < n; i++)
    {
        if(max < a[i])
        {
            max = a[i];
        }
    }

    for(i = 0; i < n; i++)
    {
        if(a[i] == max)
        {
            count++;
        }
    }

    printf("最大值出现的次数为:%d\n", count);
    
    return 0;
}

7-7 求一维数组中最小元素下标

问题:编写程序,求一维数组中最小元素下标。

#include <stdio.h>

int main()
{
    int n, i, flag;
    int a[100] = {};
    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
        int min = a[0];
        if(min >= a[i])
        {
            min = a[i];
            flag = i;
        }
    }

    printf("数组中最小元素的下标为:%d\n", flag);
    return 0;
}

7-8 存储0至N的阶乘并输出。

问题:定义长度为N+1的数组,存储0至N的阶乘,并输出。

#include <stdio.h>

int fact(int m)
{
    int result = 1, i;
    if(m == 0)
    {
        result = 1;
    }

    for(i = 1; i <= m; i++)
    {
        result = result * i;
    }
    return result;
}

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

    for(i = 0; i <= n; i++)
    {
        x = fact(i);
        printf("%d的阶乘为:%d\n", i, x);
    }
    return 0;
}

7-9 统计输出各个季度过生日的人数

问题:定义长度为12的整型数组,将你所在班级每个月过生日的人数输入数组中相应元素(1月对应下标0,2月对应下标1,……,12月对应下标11),并统计输出各个季度过生日的人数。

#include <stdio.h>

int main()
{
    int month[12] = {};
    int i, q1 = 0, q2 = 0, q3 = 0, q4 = 0;

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

    for(i = 0; i < 3; i++)
    {
        q1 = q1 + month[i];
    }

    for(i = 3; i < 6; i++)
    {
        q2 = q2 + month[i];
    }

    for(i = 6; i < 9; i++)
    {
        q3 = q3 + month[i];
    }

    for(i = 9; i < 12; i++)
    {
        q4 = q4 + month[i];
    }

    printf("第一季度生日的人数 = %d\n", q1);
    printf("第二季度生日的人数 = %d\n", q2);
    printf("第三季度生日的人数 = %d\n", q3);
    printf("第四季度生日的人数 = %d\n", q4);
    return 0;
}

7-10 使用数组存放斐波那契数列前40项,输出第38项和第39项的值,以及二者的商

问题:数列1、1、2、3、5、8、……被称为斐波那契数列,数列的第0项和第1项为1,第2项开始的每一项等于其前面两项之和。使用数组存放斐波那契数列前k项,输出第n项和第m项的值,以及二者的商。

#include <stdio.h>

int main()
{
    int f[40] = {};
    int i, k, n, m;
    float quot;
    scanf("%d %d %d", &k, &n, &m);

    f[0] = f[1] = 1;
    for(i = 2; i < k; i++)
    {
        f[i] = f[i - 2] + f[i - 1];
    }
    quot = 1.0 * f[n] / f[m];

    printf("F(%d)=%d,F(%d)=%d\n", n, f[n], m, f[m]);
    printf("黄金比例约等于:%.3f\n", quot);
    return 0;
}

注意两个整数相除想要得到小数应该乘1.0


7-11 开关门

问题:宾馆里有n(2≤n≤1000)个房间,从1∼n编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第n个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)

#include <stdio.h>

int main()
{
    int a[1000] = {};
    int i, n, j;
    scanf("%d", &n);

    for(i = 0; i <= n; i++)
    {
        a[i] = -1;
    }

    for(j = 1; j <= n; j++)
    {
        for(i = 1; i <= n; i++)
        {
            if(i % j == 0)
            {
                a[i] = -a[i];
            }
        }
    }

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

    printf("\n");

    return 0;
}

7-12 逆序存放数组中的数据,并输出指定元素

问题:本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按要求输出指定的数组元素。

#include <stdio.h>

int main()
{
    int a[10] = {};
    int i, n, t, m;
    scanf("%d", &n);

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

    scanf("%d", &m);
    printf("%d\n", a[m]);
    return 0;
}

7-13 寻找202最帅

问题:

202宿舍有六位同学,他们对自己的颜值都无比自信,这是个没有结果的争论,正好前几天刚考完试,所以他们想以这次考试的成绩来找出202最帅的。你知道他们的规则和成绩,要求你用代码给出他们答案。

规则:班主任规定的优秀成绩为n分,如果6位同学的成绩全都超过优秀成绩,请输出“202 zui shuai”,如果6位同学的成绩全都低于优秀成绩,请输出“come on!”,如果6位同学的成绩有可能有高于优秀成绩的,有可能有低于优秀成绩的,有可能有等于优秀成绩的,请先输出“zui shuai”,再输出与优秀成绩最接近的同学的成绩,请输出此时所有高出优秀成绩的同学成绩,行末无多余空格。

#include <stdio.h>

int main()
{
    int score[6] = {0};
    int gap[6] = {0};
    int n, i, min, a;
    int all_greater = 1, all_lower = 1;
    scanf("%d", &n);

    for(i = 0; i < 6; i++)
    {
        scanf("%d", &score[i]);
        if(score[i] <= n)
        {
            all_greater = 0;    //(1)
        }
        if(score[i] >= n)
        {
            all_lower = 0;
        }
    }

    if(all_greater == 1)
    {
        printf("202 zui shuai\n");
    }

    if(all_lower == 1)
    {
        printf("come on!\n");
    }

    if(all_greater == 0 && all_lower == 0)
    {
        printf("zui shuai\n");
        min = 1000;
        for(i = 0; i < 6; i++)
        {
            gap[i] = n - score[i];
            if(gap[i] < 0)
            {
                gap[i] = -gap[i];   //(2)
            }
            if(min > gap[i])
            {
                min = gap[i];
                a = score[i];
            }
        }
        printf("%d\n", a);  //(3)

        int flag = 0;
        for(i = 0; i < 6; i++)
        {
            if(score[i] > n)
            {
                if(flag == 1)
                {
                    printf(" ");    //(4)
                }
                printf("%d", score[i]);
                flag = 1;
            }
        }
    }
    return 0;
}

注:

(1)数组中所有数大于某一个数或小于某一个数的写法

(2)对于比优秀分高的分数的差值不要忘了取相反数

(3)注意输出位置

(4)行末没有空格但是中间有空格的写法


7-14 数位分离

问题:输入一个正整数n,要求输出其位数,并分别以正序和逆序输出各位数字。

#include <stdio.h>

void reverse(int arr[], int size)
{
    int i, temp;
    for(i = 0; i < size / 2; i++)
    {
        temp = arr[i];
        arr[i] = arr[size - i - 1];
        arr[size - i - 1] = temp;
    } 
}

void devide(int a)
{
    int count = 0, i;
    int out[1000] = {};
    
    while(a != 0)
    {
        count++;
        out[count-1] = a % 10;
        a = a / 10;
    }

    printf("%d", count);

    reverse(out, count);
    for(i = 0; i < count; i++)
    {
        printf(",%d", out[i]);
    }
    
    reverse(out, count);
    for(i = 0; i < count; i++)
    {
        printf(",%d", out[i]);
    }

    printf("\n");
}

int main()
{
    int T, n;
    scanf("%d", &T);
    
    while(T--)
    {
        scanf("%d", &n);
        devide(n);
    }
    return 0;
}

注意无返回值函数的引用


7-15 折半查找

问题:在一个有序的一维数组中,输入一个数,利用折半查找法找到该数是这个数组中的第几个数;如果该数不在数组中,则输出“No data!”

#include <stdio.h>

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

    int left = 0, right = n - 1, mid;
    while(left <= right)
    {
        mid = (left + right) / 2;
        if(x == a[mid])
        {
            printf("It's position is %d!\n", mid + 1);
            return 0;
        }

        else if(x < a[mid])
        {
            right = mid - 1;
        }

        else if(x > a[mid])
        {
            left = mid + 1;
        }
    }
    printf("No data!\n");
    return 0;
}

7-16 指定位置插入元素(数组)

#include<stdio.h>
int main(){
    int a[51]={2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,0};
    int x,k;
    scanf("%d %d",&x,&k);
    int i;
    if(k<0||k>50) printf("error.");
    else{
        for(i=50;i>k;i--){
        a[i]=a[i-1];
        }
        a[k]=x;
    for(i=0;i<51;i++){
        printf("%d ",a[i]);
        }
    }
    return 0;
}

7-17 数组元素的删除

#include <stdio.h>

int main()
{
    int n, k, x, i, j;
    scanf("%d", &n);
    int arr[n];
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    scanf("%d", &k);
    for (i = 0; i < k; i++)
    {
        scanf("%d", &x);
        for (j = x - 1; j < n - 1; j++)
        {
            arr[j] = arr[j+1];
        }
        n--;
    }
    for(i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

7-18 求最大数和它的下标, 并与a[0]对换位置

#include <stdio.h>  

int main()
{
    int a[10] = {};
    int i, n, max = -100, t, index;
    for(i = 0; i < 10; i++)
    {
        scanf("%d", &a[i]);
    }

    for(i = 0; i < 10; i++)
    {
        if(max < a[i])
        {
            max = a[i];
            index = i;
        }
    }

    t = a[index];
    a[index] = a[0];
    a[0] = t;
    for(i = 0; i < 10; i++)
    {
        printf("%4d", a[i]);
    }
    printf("\n");
    
    
    printf("max=%d,weizhi=%d\n", max, index);
    return 0;
}


7-19 将下标为偶数的元素值赋值给数组n


 

#include <stdio.h>

int main()
{
    int m[10] = {}, n[5] = {};
    int i, j;
    for(i = 0; i < 10; i++)
    {
        scanf("%d", &m[i]);
    }

    for(i = 0; i < 10; i++)
    {
        if(i % 2 == 0)
        {
            j = i / 2;
            n[j] = m[i];
        }
    }

    for(i = 0; i < 5; i++)
    {
        printf("%4d", n[i]);
    }
    printf("\n");
    return 0;
}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值