A+班第四次

问题A 零基础学C/C++101——最大数与数列最后一个数交换

要点

  • 交换的写法,找到最大值的方法——记录最大值和下标
#include<stdio.h>

int main()
{
    int n,a[100];

    while (~scanf("%d",&n)){

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

        int maxa=a[0],idx=0;

        for (int i=1;i<n;i++){
            if (a[i]>maxa){
                maxa = a[i];
                idx = i;
            }
        }

        int t = a[idx];
        a[idx] = a[n-1];
        a[n-1] = t;

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

问题B 零基础学C/C++102——最小数与数列第一个数交换

要点

  • 比起上题这一题记录最小值和下标,注意适合第一个数交换也就是下标为0的数
#include<stdio.h>

int main()
{
    int n,a[100];

    while (~scanf("%d",&n)){

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

        int mina=a[0],idx=0;

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

        int t = a[idx];
        a[idx] = a[0];
        a[0] = t;

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

问题C 零基础学C/C++103——找出一个数组中出现次数最多的那个元素

要点

  • 这题比较难讲,我们另外开一个数组,储存数量,为什么只要遍历到i-1就行了,我们分类讨论:1.当前是最后,正确 2.当前不是最后,那么后面可能正确。
#include<stdio.h>

int main()
{
    int n,a[100],cnt[100];

    while (~scanf("%d",&n)){

        for (int i=0;i<n;i++) cnt[i] = 0;

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

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

    }
    return 0;
}

问题D 零基础学C/C++104——查找某一个数

要点

  • 初始化为-1,这题可以扯皮一下二分的方法
#include<stdio.h>

int main()
{
    int n,a[100],x;

    while (~scanf("%d%d",&x,&n)){

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

        int idx = -1;

        for (int i=0;i<n;i++){
            if (a[i]==x){
                idx = i;
                break;
            } 
        }

        if (idx==-1) printf("Not Found\n");
        else printf("%d\n",idx);

    }
    return 0;
}

问题E 零基础学C/C++105——元素前移1位

要点

  • 代码写的是偷懒的办法,考察这题需要用另外一种写法,就是先记录一下a[0],然后a1~an左移,然后a0放到an-1
#include<stdio.h>

int main()
{
    int n,a[100];

    while (~scanf("%d",&n)){

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

        for (int i=1;i<n;i++) printf("%d ",a[i]);
        printf("%d\n",a[0]);

    }
    return 0;
}

问题F 进制转换

要点

  • 重点之一:进制转换本身,就是不停从后面取余数,然后除自身的做法
  • 此题与负数取余无关,只是进制转换,把负号去掉即可
  • 没必要讲7%-3,-7%3,结果是都都取商更趋向0的那一种,在C++中
#include<stdio.h>

int main()
{
    int n,r;

    while (~scanf("%d %d",&n,&r)){

        int flag = 1;
        if (n<0) {
            flag = -1;
            n = -n;
        }
        int a[100],idx = 0;
        while (n!=0){
            a[idx++] = n%r;
            n = n/r;
        }


        if (flag==-1) printf("-");
        for (int i=idx-1;i>=0;i--){
            if (a[i]>=10) printf("%c",a[i]-10+'A');
            else printf("%d",a[i]);
        }
        printf("\n");

    }
    return 0;
}

问题G 零基础学C/C++107——插入一个数到数列中

要点

  • 再次强调如何把数插入到数列中——后面的后移
  • 顺便讲一下数组初始化的方法
#include<stdio.h>

int main()
{
    int m;

    while (~scanf("%d",&m)){

        int a[10] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 0};

        int idx = 0;
        for (int i=0;i<9;i++){
            if (m>=a[i]) idx = i+1;
        }
        for (int i=8;i>=idx;i--) a[i+1] = a[i];
        a[idx] = m;

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

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

问题H 零基础学C/C++108——程序设计竞赛

要点

  • 经典选择排序
#include<stdio.h>

int main()
{
    int n,a[30];

    while (~scanf("%d",&n)){

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

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

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

**问题L 零基础学C/C++112——偶数排序 **

要点

  • 首先一个很正常的思路就是把普通的奇数变成绝对值很大的负数,统计数量
  • 然后排完序不输出哪几个就行了
  • 然后强调一下,奇数取余可能是-1,也可能是正1,比如-7%2==-1,所以可以用&1或者等于±1
#include<stdio.h>

int main()
{
    int n,a[30];

    while (~scanf("%d",&n)){
        int jishu = 0;
        for (int i=0;i<n;i++) {
            scanf("%d",&a[i]);
            if (a[i]&1) a[i]=-1000000000,jishu++;
        }

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

        for (int i=0;i<n-jishu;i++) printf("%d ",a[i]);
        printf("\n");
    }
    return 0;
}

问题M 零基础学C/C++113——并列排名

要点

  • 我们要查的分数是这些一样中的第一个,那么我们只需要知道比这靠前的有多少个,下一个就是对应的排名。
#include<stdio.h>

int main()
{
    int n,a[100];

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

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

        int m;
        scanf("%d",&m);

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

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页