PTA - No.9 - 12道题总结

这周的编程题还是有点难度的,而且代码有的比较长不好截图分享到群相册,发文本又太没意思,就直接一起记录在一个博客里好了:(所有的程序都只需要 #include <stdio.h> 所以不每个都写了

7-1 查找整数 (10 分)

int main()
{
    int N, X, t, i;
    scanf("%d%d", &N, &X);
    for(i = 0; i < N; i++)
    {
        scanf("%d", &t);
        if(t == X)
        {
            printf("%d\n", i);
            return 0;
        }
    }
    if(i == N)    printf("Not Found\n");
    return 0;
}

7-2 将数组中的数逆序存放 (20 分) 

int main()
{
    int n, a[10];
    scanf("%d", &n);
    for(int i = 0; i < n; i++)      scanf("%d", &a[i]);
    for(int i = n - 1; i > 0; i--)  printf("%d ", a[i]);
    printf("%d\n", a[0]);       // 行末不得有多余空格
    return 0;
}

7-3 选择法排序 (20 分)

int main()
{
    int n, a[10];
    scanf("%d", &n);
    for(int i = 0; i < n; i++)    scanf("%d", &a[i]); // 先全读进来
    for(int i = 0; i < n - 1; i++)      // 每次选一个最小的和有序列后一位交换
    {
        int minV = a[i], minIdx = i;      // 最小值,最小值位置
        for(int j = i + 1; j < n; j++)
            if(a[j] < minV)
            {
                minV = a[j];
                minIdx = j;
            }
        if(minIdx != i)
        {
            int tmp = a[i];
            a[i] = a[minIdx];
            a[minIdx] = tmp;
        }
    }
    for(int i = n - 1; i > 0; i--)
        printf("%d ", a[i]);
    printf("%d\n", a[0]);   // 行末不得有多余空格
    return 0;
}

7-4 交换最小值和最大值 (15 分)

int main()
{
    int n, a[10];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)		scanf("%d", &a[i]);
    int max = -1, maxi = -1, min = 2147483647, mini = -1; // INT_MAX
    for(int i = 0; i < n; i++)
        if(a[i] < min)
        {
            min = a[i];
            mini = i;
        }
    a[mini] = a[0];
    a[0] = min;
    for(int i = 0; i < n; i++)  // 必须重新计算,因为交换min之后,最大值位置可能变了
        if(a[i] > max)
        {
            max = a[i];
            maxi = i;
        }
    a[maxi] = a[n - 1];
    a[n - 1] = max;
    for(int i = 0; i < n; i++)
        printf("%d ", a[i]);
    return 0;
}

7-5 简化的插入排序 (15 分)

int main()
{
    int N, a[10], X;
    scanf("%d", &N);
    for(int i = 0; i < N; i++)
        scanf("%d", &a[i]);
    scanf("%d", &X);
    int i;
    for(i = 0; i < N; i++)
        if(a[i] > X)
        {
            for(int j = N; j > i; j--)
                a[j] = a[j - 1];
            a[i] = X;
            break;
        }
    if(i == N)                  // 都比X小
        a[N] = X;
    for(int i = 0; i <= N; i++)
        printf("%d ", a[i]);    // 每个数字后面有一个空格
    return 0;
}

7-6 求一批整数中出现最多的个位数字 (20 分)

int main()
{
    int N, a[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, maxTime = 0;
    scanf("%d", &N);
    for (int i = 0; i < N; i++)
    {
        int t;
        scanf("%d", &t);      // 非负整数
        do
        {
            ++a[t % 10];
            t /= 10;
        } while (t != 0)      // do while处理数字为0的情况
    }
    for (int i = 0; i < 10; i++)
        if (a[i] > maxTime)
            maxTime = a[i];
    printf("%d:", maxTime);
    for (int i = 0; i < 10; i++)
        if (a[i] == maxTime)
            printf(" %d", i);
    return 0;
}

7-7 输出数组元素 (15 分)

int main()
{
    int N, a[10];
    scanf("%d", &N);
    for (int i = 0; i < N; i++)  scanf("%d", &a[i]);  // n个整数
    for(int i = 0; i < N - 1; i++)
    {
        printf("%d", a[i + 1] - a[i]);
        if((i + 1) % 3 == 0 || i == N - 2)  printf("\n");
        else                                printf(" ");
    }
    return 0;
}

7-8 找出不是两个数组共有的元素 (20 分)

    这道题网上很多答案用了三个数组,我用了一个数组,flag数组是用来代替数组删除操作的,不怎么影响时间复杂度。

int main()
{
    int an, ancnt, bn, tmp, cnt = 0, first = 1;
    // C static数组默认全初始化为0, flag[i]为0表示res[i]这位数不输出
    static int res[40], flag[40];   // 用flag数组代替删除操作
    scanf("%d", &an);
    ancnt = an;
    for (int i = 0; i < an; i++)    // 读第一个数组, 跳过重复的
    {
        scanf("%d", &tmp);
        int j = 0;
        for (j = 0; j < cnt; j++)
            if (flag[j] == 1 && res[j] == tmp)
                break;
        if (j == cnt)
        {
            res[cnt] = tmp;
            flag[cnt] = 1;
            ++cnt;
        }
        else
            --ancnt;                // 记录第一个数组存入res多少个数!!
    }
    scanf("%d", &bn);
    for (int i = 0; i < bn; i++)    // 读第二个数组, res中出现过的话,对应位flag归0,继续下一个数
    {
        scanf("%d", &tmp);
        int j = 0;
        for (j = 0; j < cnt; j++)
            if (res[j] == tmp)    // 这里不能判断flag!!!!!!因为只要出现过就一定不需要了
                break;
        if (j == cnt)             // res中没出现过
        {
            res[cnt] = tmp;
            flag[cnt] = 1;
            ++cnt;
        }
        else if (j < ancnt)       // 在第一个数组中出现过
            flag[j] = 0;
        // 在第二个数组中重复了就直接跳过
    }
    for (int i = 0; i < 40; i++)
        if(flag[i] == 1 && first == 1)
        {
            printf("%d", res[i]);
            first = 0;
        }
        else if(flag[i] == 1)
            printf(" %d", res[i]);
    return 0;
}

7-9 求整数序列中出现次数最多的数 (15 分)

int main()
{
    int N = 0, num = 0, a[1000], maxTime = -1, maxIdx = -1;
    static int cnt[1000];
    scanf("%d", &N);
    for (int i = 0; i < N; i++)
    {
        int tmp, j;
        scanf("%d", &tmp);
        for (j = 0; j < num; j++)
            if (a[j] == tmp)
            {
                ++cnt[j];
                break;
            }
        if (j == num)
        {
            a[num] = tmp;
            cnt[num] = 1;
            ++num;
        }
        if (cnt[j] > maxTime)
        {
            maxTime = cnt[j];
            maxIdx = j;
        }
    }
    printf("%d %d\n", a[maxIdx], maxTime);
    return 0;
}

7-10 求最大值及其下标 (20 分)

int main()
{
    int n, tmp, maxV = -2147483648, maxIdx = -1;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &tmp);
        if(tmp > maxV)
        {
            maxV = tmp;
            maxIdx = i;
        }
    }
    printf("%d %d\n", maxV, maxIdx);
    return 0;
}

7-11 特殊a串数列求和 (20 分)

int main()
{
    int a, n, sum = 0;
    scanf("%d%d", &a, &n);
    // 2 + 22 + 222 就是一个200,两个20,三个2
    for(int i = 1; i <= n; i++)
        sum += a * (int)pow(10, n - i) * i;
    printf("s = %d\n", sum);
    return 0;
}

7-12 兔子繁衍问题 (15 分)

     这道题其实手算几个之后就找到规律了,其实就是斐波那契数列:

     第几个月:1、2、3、4、5

     几对兔子:1、1、2、3、5

int main()
{
    int n, f1 = 1, f2 = 1, months = 0;
    scanf("%d", &n);
    for (months = 1;; months++)
    {
        if(f1 >= n)
        {
            printf("%d\n", months);
            return 0;
        }
        f2 = f1 + f2;
        f1 = f2 - f1;
    }
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值