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日