Top

本地磁盤小日記ヾ(≧▽≦*)ゝ

世界無限大.且行且珍惜w;
計算機科學視覺與美術在學|跨女|程序媛|創作者|中日英OK|公主w;

教程:我的浙大PAT备考笔记01-基本代码能力篇1;

| Comments

PAT | 计算机程序设计能力考试 https://www.patest.cn/
HelloWorld | 几句话的事儿 http://hworld.aimo.moe/


包括:3n+1猜想、挖掘机技术哪家强、找x、图形输出、日期差值、进制转换等。参见《算法笔记》第三章。备考笔记持续更新w~


PAT B1001 害死人不偿命的(3n+1)猜想

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(){
    int n, step=0;          //定义n与记步
    scanf("%d",&n);
    while(n!=1){            //当n不等于1时参与循环算法
        if(n%2==0) n=n/2;   //当n为偶数时
        else n=(3*n+1)/2;   //当n为奇数时
        step++;             //记步+1
    }
    printf("%d\n",step);
    return 0;
}

PAT B1032 挖掘机技术哪家强

为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。 输入格式:

输入在第 1 行给出不超过 10?的5次方?? 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。 输出格式:

在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
const int maxn=10010;       //不超过10的5次方
int school[maxn]={0};       //定义数组存放
int main(){
    int n,schID,score;
    scanf("%d",&n);
    for(int i=0;i<n;i++){       //循环不大于行号   
        scanf("%d%d",&schID,&score);
        school[schID]+=score;   //学校schID的总分增加score
    }
    int k=1,MAX=-1;             //k为id,MAX为最高学校总分
    for(int i=1;i<=n;i++){
        if(school[i]>MAX){
            MAX=school[i];
            k=i;
        }
    }
    printf("%d %d",k,MAX);
    return 0;
}

codeup 1934 找x

输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。 输入:测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。 输出:对于每组输入,请输出结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <cstdio>
const int maxn=210;             //n(1<=n<=200)
int a[maxn];
int main(){
    int n,x;
    while(scanf("%d",&n)!=EOF){     //输入一个数n
        for(int i=0;i<'n';i++){       //循环输入n个数值各不相同
            scanf("%d",&a[i]);
            }
        scanf("%d",&x);             //输入x
        int k;                      //下标
        for(k=0;k<'n';k++){           //遍历数组
            if(a[k]==x){            //如果找到x
                printf("%d\n",k);
                break;
                }
            }
            if(k==n){               //如果没找到x
                printf("-1\n");
            }
        }
    return 0;
}

PAT B1036 跟奥巴马一起编程

2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!

输入:输入在一行中给出正方形边长 N (3<= N<= 20)和组成正方形边的某种字符 C,间隔一个空格。

输出:由给定字符 C 画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的 50%(四舍五入取整)。

四舍五入可通过判断奇偶性解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <cstdio.h>

int main(){
    int row, col;
    char c;
    //行.列与要输出的字符
    scanf("%d %c",&col,&c);
    if(col%2==1) row=col/2+1;
    else row=col/2;
    //判断奇偶性
    for(int i=0;i<col;i++)  {printf("%c",c);}   //每行的第一个a
    //多少列
    printf("\n");
    //第二至row-1行
    for(int i=2;i<row;i++){
        printf("%c",c);     //每行的第一个a
        for(int j=0;j<col-2;j++){
            printf(" ");    //行-2个空格
        }
        printf("%c\n",c);   //每行的最后一个a
    }
    //第row行
    for(int i=0;i<col;i++){
        printf("%c",c);
    }
    return 0;
}

codeup 1928 日期差值

题目描述:有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

输入:有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出:每组数据输出一行,即日期差值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <cstdio>

int month[13][2]={ {0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31} };

//定义平年闰年每个月天数数组。

bool isLeap(int year){
    return (year%4==0&year%100!=0)||(year%4==0);
}

//判断是否为闰年,四年一润百年不润四百年又润。

int main(){
    int time1,y1,m1,d1;
    int time2,y2,m2,d2;
    while(scanf("%d%d",&time1,&time2)!=EOF){
        if(time1>time2){
            int temp=time1;
            time1=time2;
            time2=temp;
        }

        //如果第一个日期比第二个日期晚,就交换变量。

        y1=time1/10000, m1=time1%10000/100, d1=time1%100;
        y2=time2/10000, m2=time2%10000/100, d2=time2%100;

        //提取ymd。

        int ans=1;

        //记录结果。

        while(y1<y2||m1<m2||d1<d2){
            d1++;
            if(d1==month[m1][isLeap(y1)]+1){    //满月。
                    m1++;
                    d1=1;
               }
               if(m1==13){          //月份满12个月。
                    y1++;
                    m1=1;
               }
               ans++;           //累计
        }
        printf("%d\n",ans);     //输出。
    }
    return 0;
}

PAT B1022 D进制的A+B

题目描述:输入两个非负10进制整数A和B(<=2的30次方-1),输出A+B的D (1 < D <= 10)进制数。

输入格式:输入在一行中依次给出3个整数A、B和D。

输出格式:输出A+B的D进制数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
十进制转二进制的除基取余法:
11除2,商5,余1;
5除2,商2,余1;
2除2,商1,余0;
1除2,商0,余1。
所以11转换2进制为1101。
</pre></code>

<pre><code>
#include <cstdio>
int main(){
    int a, b, d;
    scanf("%d%d%d",&a,&b,&d);
    int sum=a+b;

    //因此得到a+b的十进制形式。

    int ans[31], num=0;

    ans存放D进制的每一位。

    do{
        ans[num++]=sum%d;
        sum/=d;
    }while(sum!=0);

    //进制转换。

    for(int i=num-1;i>=0;i--){
        printf("%d",ans[i]);
    }

    //由高到低进行输出。

    return 0;
}

codeup 5901 回文串

题目描述:读入一串字符,判断是否是回文串。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。

输入:一行字符串,长度不超过255。

输出:如果是回文串,输出“YES”,否则输出“NO”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <cstdio>
#include <cstring>

const int maxn=256;

//长度不超过255。

bool judge(char str[]){
    int len=strlen(str);    //字符串长度
    for(int i=0;i<len/2;i++){   //i枚举字符串前一半
        if(str[i]!=str[len-1-i]){   //如果对称位置不同
            return false;
        }
    }
    return true;
}

//判断字符串str是否为回文串。

int main(){
    char str[maxn];
    while(gets(str)){       //输入字符串
        bool flag=judge(str);   //判断str是否为回文串
        if(flag==true){
            printf("YES\n");
        }else{printf("NO\n");}
    }
    return 0;
}

PAT B1009 说反话

给定一句英语,要求编写程序,将句中所有单词的顺序颠倒输出。

输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。

输出格式:每个测试用例的输出占一行,输出倒序后的句子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <cstdio>
#include <cstring>

    int main(){
        char str[90];
        gets(str);
        int len=strlen(str),r=0,h=0;    //r为行,h为列。
        char ans[90][90];               //存放单词。
        for(int i=0;i<len;i++){
            if(str[i]!=' '){            //如果不是空格,则存放至ans[r][h],并令h++。
                ans[r][h++]=str[i];
            }else{                      //如果是空格,单词结束,r+1,h=0。
                ans[r][h++]='\0';
                r++;
                h=0;
            }
        }
        for(int i=r;i>=0;i--){          //倒着输出单词。
            printf("%s",ans[i]);
            if(i>0)printf(" ");
        }
        return 0;
    }

@本地磁盘姬

ohayou.aimo.moe

微博:@本地磁盘姬碟酱

Twitter:@AmyGreen

2019年03月17日

Comments