ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2020年冬季PAT乙级题解(C语言)

2022-02-10 23:02:49  阅读:137  来源: 互联网

标签:输出 PAT 数字 ++ 题解 样例 C语言 输入 好运


7-1 祖传好运 (15 分)
我们首先定义 0 到 9 都是好运数,然后从某个好运数开始,持续在其右边添加数字,形成新的数字。我们称一个大于 9 的数字 N 具有祖传好运,如果它是由某个好运数添加了一个个位数字得到的,并且它能被自己的位数整除。

例如 123 就是一个祖传好运数。首先因为 1 是一个好运数的老祖宗,添加了 2 以后,形成的 12 能被其位数 2 (即 12 是一个 2 位数)整除,所以 12 是一个祖传好运数;在 12 后面添加了 3 以后,形成的 123 能被其位数 3 整除,所以 123 是一个祖传好运数。

本题就请你判断一个给定的正整数 N 是不是具有祖传的好运。

输入格式:
每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 K (≤1000);第 2 行给出 K 个不超过 10^9的待评测的正整数,注意这些数字都保证没有多余的前导零。

输出格式:
对每个待评测的数字,在一行中输出 Yes 如果它是一个祖传好运数,如果不是则输出 No。

输入样例:
5
123 7 43 2333 56160

输出样例
Yes
Yes
No
No
Yes

AC代码:

#include <stdio.h>
int main(){
    int k, a, t, i, j, cnt, flag;
    scanf("%d ", &k);
    for(i = 0;i < k;i++){
        scanf("%d ", &a);
        t = a;
        cnt = 0;
        flag = 0;
        while(t != 0){
            t /= 10;
            cnt++;
        }
        for(j = cnt;j > 0;j--){
            if(a % j == 0) a /= 10;
            else{
                flag = 1;
                break;
            }
        }
        if(!flag) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

7-2 找奇葩 (20 分)
在一个长度为 n 的正整数序列中,所有的奇数都出现了偶数次,只有一个奇葩奇数出现了奇数次。你的任务就是找出这个奇葩。

输入格式:
输入首先在第一行给出一个正整数 n(≤10^4),随后一行给出 n 个满足题面描述的正整数。每个数值不超过 10 ^5,数字间以空格分隔。

输出格式:
在一行中输出那个奇葩数。题目保证这个奇葩是存在的。

输入样例:
12
23 16 87 233 87 16 87 233 23 87 233 16

输出样例:
233

AC代码:

#include <stdio.h>
int main(){
    int n, i, a[10000], b[100000] = {0};
    scanf("%d", &n);
    for(i = 0;i < n;i++){
        scanf("%d ", &a[i]);
        if(a[i] % 2 != 0) b[a[i]]++;
    }
    for(i = 0;i < n;i++){
        if(b[a[i]] % 2 != 0){
            printf("%d", a[i]);
            break;
        }
    }
    return 0;
}

7-3 舍入 (20 分)
不同的编译器对浮点数的精度有不同的处理方法。常见的一种是“四舍五入”,即考察指定有效位的后一位数字,如果不小于 5,就令有效位最后一位进位,然后舍去后面的尾数;如果小于 5 就直接舍去尾数。另一种叫“截断”,即不管有效位后面是什么数字,一概直接舍去。还有一种是“四舍六入五成双”,即当有效位的后一位数字是 5 时,有 3 种情况要考虑:如果 5 后面还有其它非 0 尾数,则进位;如果没有,则当有效位最后一位是单数时进位,双数时舍去,即保持最后一位是双数。

本题就请你写程序按照要求处理给定浮点数的舍入问题。

输入格式:
输入第一行给出两个不超过 100 的正整数 N 和 D,分别是待处理数字的个数和要求保留的小数点后的有效位数。随后 N 行,每行给出一个待处理数字的信息,格式如下:
指令符 数字
其中指令符是表示舍入方法的一位数字,1 表示“四舍五入”,2 表示“截断”,3 表示“四舍六入五成双”;数字是一个总长度不超过 200 位的浮点数,且不以小数点开头或结尾,即 0.123 不会写成 .123,123 也不会写成 123.。此外,输入保证没有不必要的正负号(例如 -0.0 或 +1)。

输出格式:
对每个待处理数字,在一行中输出根据指令符处理后的结果数字。

输入样例:
7 3
1 3.1415926
2 3.1415926
3 3.1415926
3 3.14150
3 3.14250
3 3.14251
1 3.14

输出样例:
3.142
3.141
3.142
3.142
3.142
3.143
3.140

AC代码:
本题测试点太坑了,写了很长时间,交了第一发拿到了18分,然后愣是到最后也没把最后两个测试点改对。这题的代码我先不贴出来,后面如果抽空把它改对了再贴出来。先把18分的截图贴这儿,希望后面能写出来并涨个教训。

在这里插入图片描述
7-4 最近的斐波那契数 (20 分)
斐波那契数列 Fn 的定义为:对 n≥0 有 Fn+2=Fn+1 + Fn,初始值为 F0=0 和 F1 =1。所谓与给定的整数 N 最近的斐波那契数是指与 N 的差之绝对值最小的斐波那契数。

本题就请你为任意给定的整数 N 找出与之最近的斐波那契数。

输入格式:
输入在一行中给出一个正整数 N(≤10^8)。

输出格式:
在一行输出与 N 最近的斐波那契数。如果解不唯一,输出最小的那个数。

输入样例:
305

输出样例:
233

样例解释
部分斐波那契数列为 { 0, 1, 1, 2, 3, 5, 8, 12, 21, 34, 55, 89, 144, 233, 377, 610, … }。可见 233 和 377 到 305 的距离都是最小值 72,则应输出较小的那个解。

AC代码:

#include <stdio.h>
int main(){
    int a = 0, b = 1, c = 1, n, former = a;
    scanf("%d", &n);
    while(c < n){
        former = c;
        a = b;
        b = c;
        c = a + b;
    }
    printf("%d", c - n >= n - former ? former : c);
    return 0;
}

7-5 子串与子列 (25 分)
子串是一个字符串中连续的一部分,而子列是字符串中保持字符顺序的一个子集,可以连续也可以不连续。例如给定字符串 atpaaabpabtt,pabt是一个子串,而 pat 就是一个子列。

现给定一个字符串 S 和一个子列 P,本题就请你找到 S 中包含 P 的最短子串。若解不唯一,则输出起点最靠左边的解。

输入格式:
输入在第一行中给出字符串 S,第二行给出 P。S 非空,由不超过 10^4个小写英文字母组成;P 保证是 S 的一个非空子列。

输出格式:
在一行中输出 S 中包含 P 的最短子串。若解不唯一,则输出起点最靠左边的解。

输入样例:
atpaaabpabttpcat
pat

输出样例:
pabt

AC代码:

#include <stdio.h>
#include <string.h>
int main(){
    char s[10001], p[10001];
    int i, j, t = 0, len, min = 10001, m, n, k = 0, flag = 0;
    scanf("%s\n%s", s, p);
	   while(1){
        for(i = 0;i < strlen(p);i++){
           if(!i){
               for(j = t + k;j < strlen(s);j++){
                   if(s[j] == p[i]){
                       k = 1;
                       break;
                   }
               }
               t = j;
           }else{
                for(j++;j < strlen(s);j++){
                    if(s[j] == p[i]) break;
                }
           }
           if(j == strlen(s)){ 
              flag = 1;
              break;
           }
        }
        if(flag == 1) break;
        len = j - t + 1;
        if(len < min){
            min = len;
            m = t;
            n = j;
        }
    }
    for(i = m;i <= n;i++) printf("%c", s[i]);
    return 0;
}

标签:输出,PAT,数字,++,题解,样例,C语言,输入,好运
来源: https://blog.csdn.net/qq_52491362/article/details/122870620

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有