PTA练习题

本文详细介绍了多个C++编程练习题,包括取石子游戏的胜负判断、字符大小写转换、分段函数求值等。通过实例解析输入输出格式,涉及递归、位运算符和条件判断等编程技巧。

目录

7-2 取石子(二) (10 分)

 7-3 大小写字符转换 (6 分)

 分支结构——大小写字母判断 (5 分)

7-4 冠军魔术 (10 分)

4-2判断闰年 (5 分)

7-6 判断一个三位数是否为水仙花数 (10 分)

7-7 求中间数 (8 分)

7-9 有多少位是7? (8 分) 

7-10 多分支表达-数据奇偶判断 (8 分)

7-12 强迫症 (10 分)

7-13 分段函数求值 (5 分)

7-14 判断10的倍数 (5 分)


 

7-2 取石子(二) (10 分)

Tom 和 Mary 玩取石子的游戏:n 颗石子码成一堆,从 Tom 开始,两人轮流取石子,最少取 1 颗、最多取 2 颗,谁取到最后一颗石子,谁就失败。两个人都极聪明,不会放过任何取胜的机会。请同样聪明的你编写程序,输入石子的数量,输出胜者的名字。

输入格式

石子的数量

输出格式

胜者的名字

输入样例1

1

输出样例1

Mary

输入样例2

2

输出样例2

Tom

经典巴什博弈 给对面留下(2+1)的倍数就能赢

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n%3==1)
    {
         printf("Mary");
    }
    else if (n%3==2)
    {
        printf("Tom");
    }
    else 
    {
        printf("Tom");
    }
}

 7-3 大小写字符转换 (6 分)

输入一个字符,如果是大写字母,将它转换成小写字母并输出;如果是小写字母,将它转换成大写字母并输出;如果都不是,则输出:error

输入样例:

a

输出样例:

A

输入样例:

B

输出样例:

b

输入样例:

1

输出样例:

error

输出字符数字实质上是输出ASCII码对应值

而大小写ASCII码值相差32

#include <stdio.h>
#include <math.h>
#include<stdbool.h>

int main()
{
    char c;
    scanf("%c",&c);
    if(c>=97&&c<=122)
    {
        c=c-32;
        printf("%c",c);
    }
    else if(c>=65&&c<=90)
    {
        c=c+32;
        printf("%c",c);
    }
    else
    {
        printf("error");
    }


    return 0;
}

下面是一道一样的题目

 分支结构——大小写字母判断 (5 分)

键盘输入一个英文字母,如果是大写字母,输出ASCII码,如果是小写字母输出对应的大写字母。(其它情况没有输出)

输入格式:

输入一个英文字母。

输出格式:

根据输入的字母,输出ASCII码或者大写字母

输入样例1:

A

输出样例1:

65

输入样例2:

a

输出样例2:

A
#include<stdio.h>

int main()
{
    int year;
    char a,b,c;
    int t,s;
    scanf("%c",&a);
    if(a>=97&&a<=122)
    {
        printf("%c",a-32);
    }
    if(a>=65&&a<=90)
    {
        printf("%d",a);
    }



return 0;
}

 

7-4 冠军魔术 (10 分)

2018年FISM(世界魔术大会)近景总冠军简纶廷的表演中有一个情节:以桌面上一根带子为界,当他将纸牌从带子的一边推到另一边时,纸牌会变成硬币;把硬币推回另一边会变成纸牌。

这里我们假设纸牌会变成等量的硬币,而硬币变成纸牌时,纸牌的数量会加倍。那么给定纸牌的初始数量,当他来回推了 N 次(来/回各算一次)后,手里拿的是纸牌还是硬币?数量是多少?

输入格式:

输入在一行里给出两个正整数,分别是纸牌的初始数量和魔术师推送的次数。这里假设初始状态下魔术师手里全是纸牌。

输出格式:

如果最后魔术师手里是纸牌,输出 0 和纸牌数量;如果是硬币,则输出 1 和硬币数量。数字间须有 1 个空格。题目保证结果数值不超出整型范围(即 231−1)。

输入样例 1:

3 7

输出样例 1:

1 24

输入样例 2:

8 4

输出样例 2:

0 32

找规律总结数学公式   或者将每一次情况模拟出来

#include<stdio.h>
#include<math.h>
int main()
{
    int num,lun;//数量与次数
    int type,nums;
    scanf("%d %d",&num,&lun);
    if(lun%2==0)
    {
        type=0;
    }
    else
    {
        type=1;
    }
    nums=num*pow(2,lun/2);
    printf("%d %d",type,nums);



}

4-2判断闰年 (5 分)

条件   :被4整除但不能被100正除  或能被400整除

#include<stdio.h>

int main()
{int year;
scanf("%d",&year);
if((year%4==0&&year%100!=0 )|| year%400==0)
{
    printf("%d is leap year.",year);
}
else
{
    printf("%d is not leap year.",year);

}

return 0;
}

7-6 判断一个三位数是否为水仙花数 (10 分)

本题要求编写程序,判断一个给定的三位数是否为水仙花数。三位水仙花数,即其个位、十位、百位数字的立方和等于该数本身。

输入格式:

输入在一行中给出一个需要判断的整数 N(100≤N≤999)。

输出格式:

如果N是水仙花数,则在一行中输出Yes,否则输出No。如果N不是三位数,则输出Invalid Value.

输入样例1:

153

输出样例1:

Yes

输入样例2:

500

输出样例2:

No

输入样例3:

-2

输出样例3:

Invalid Value.

先将输入数据筛选     不符合三位数输出无效  符合取出三位数进行判断

#include<stdio.h>

int main()
{
    int year;
    int a,b,c;
    scanf("%d",&year);
    if(year<100||year>999)
    {
        printf("Invalid Value.");
    }
    else{
        a=year%10;
        b=year/10%10;
        c=year/100;
        if(a*a*a+b*b*b+c*c*c==year)
        {
            printf("Yes");
        }
        else{
            printf("No");
        }

    }

return 0;
}

        7-7 求中间数 (8 分)

这里我是建议用冒泡和快速排序    ,用if判断只要看懂就行了

if版

#include<stdio.h>

int main()
{
    int year;
    int a,b,c;
    int t,s;
    scanf("%d %d %d",&a,&b,&c);
/*
if(a>b&&b>c||c>b&&b>a)
{
    printf("%d",b);
}
if(b>a&&a>c||c>a&&a>b)
{
    printf("%d",a);
}
if(b>c&&c>a||a>c&&c>b)
{
    printf("%d",c);
}
*/
    if(a<b)
    {
        t=a;
        a=b;
        b=t;
    }
    if(a<c)
    {
        t=a;
        a=c;
        c=t;
    }
    if(b<c)
    {
        t=b;
        b=c;
        c=t;
    }
    printf("%d",b);
    
    
    
return 0;
}

c++版

#include<iostream>
#include<algorithm>
#include<functional>

using namespace std;

int a[5];
int main()
{
    int i,j,k;

    for(i=0;i<3;i++)
    {
        cin>>a[i];
    }
    sort(a,a+3);//左闭右开   对a[0]和a[2]进行排序
    cout<<a[1];


    return 0;
}


7-9 有多少位是7? (8 分) 

描述

从键盘读入一个4位数的整数,求该数中有多少位是7

输入格式:

一个4位数的整数

输出格式:

该整数中7的个数

输入样例:

在这里给出一组输入。例如:

4757

输出样例:

在这里给出相应的输出。例如:

2

两种思路:

1.将四位数取出来依次判断是否为数字7

2.用一个变量录入字符  一个一个地判断输入的字符是否为字符7

这里用的是方案2 

c++

#include<iostream>
#include<algorithm>
#include<functional>

using namespace std;

char temp;
int main()
{
    int i,j,k;
    int sum=0;
    for(i=0;i<4;i++)
    {
        cin>>temp;
        if(temp=='7')
            sum++;
    }
    cout<<sum;



}


7-10 多分支表达-数据奇偶判断 (8 分)

键盘输入两个非零整数A和B,如果A和B都是偶数则输出两个数的和,如果A和B都是奇数则输出两个数的差,如果A是奇数B是偶数则输出两数积,如果A是偶数B是奇数输出A/B结果

输入格式:

输入两个非零整数,逗号分隔

输出格式:

如果A和B都是偶数则输出:A+B=两个数的和; 如果A和B都是奇数则输出:A-B=两个数的差; 如果A是奇数B是偶数则输出:A*B=两数积; 如果A是偶数B是奇数输出:A/B=两个数的商。 如果输入数据A为0或B为0,没有任何输出。

输入样例:

在这里给出一组输入。例如:

18,20

输出样例:

在这里给出相应的输出。例如:

18+20=38

放源代码了

#include<stdio.h>
#include<math.h>
int main()
{
    int year;
    int a,b,c,d;
    int i=0;
    int A,B;
    char s;

    scanf("%d%c%d",&a,&s,&b);
    if(a!=0&&b!=0)
    {
          if(a%2==0&&b%2==0)
        {
            printf("%d+%d=%d",a,b,a+b);
        }
        if(a%2!=0&&b%2!=0)
        {
            printf("%d-%d=%d",a,b,abs(a-b));
        }
        if(a%2!=0&&b%2==0)
        {
            printf("%d*%d=%d",a,b,a*b);
        }
        if(a%2==0&&b%2!=0)
        {
            printf("%d/%d=%d",a,b,a/b);
        }

    }

return 0;
}

这里再提供一种高效的判断奇偶的方法----->使用位运算符,感兴趣的同学可以去查查

注意不要漏掉括号了哦,&    优先级低于  ==

#include<iostream>
#include<algorithm>
#include<functional>

using namespace std;

char temp;
int main()
{
    int n;
    cin>>n;
    if((n&1)==0)
        printf("n为偶数\n");
    else
        printf("n为奇数\n");


}


7-12 强迫症 (10 分)

小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808。有强迫症的小强请你写个程序,把所有人的出生年月都整理成 年年年年-月月 格式。对于那些只写了年份后两位的信息,我们默认小于 22 都是 20 开头的,其他都是 19 开头的。

输入格式:

输入在一行中给出一个出生年月,为一个 6 位或者 4 位数,题目保证是 1000 年 1 月到 2021 年 12 月之间的合法年月。

输出格式:

在一行中按标准格式 年年年年-月月 将输入的信息整理输出。

输入样例 1:

9808

输出样例 1:

1998-08

输入样例 2:

0510

输出样例 2:

2005-10

输入样例 3:

196711

输出样例 3:

1967-11

 分类讨论,不重不漏

%02d的意思为 该整型数据占2格右对齐    左边不能占满用字符0代替

#include<stdio.h>

int main()
{
    int year;
    int a,b,c,d;
    double t,s,x;
    scanf("%d",&year);
    if(year<10000)
    {
        a=year/100;//未前缀年
        b=year%100;//月份
        if(a<22)
        {
           printf("20%02d-%02d",a,b);
        }
        else{
            printf("19%02d-%02d",a,b);
        }

    }
    else
    {

        b=year/100;//前缀年
        d=year%100;//月份
        printf("%d-%02d",b,d);

    }



return 0;
}

7-13 分段函数求值 (5 分)

根据如下分段函数定义求y的值。

y=⎩⎨⎧​x22x−13x−11​x<00≤x<10x≥10​

输入格式:

在一行中输入浮点数x。

输出格式:

输出y的值,保留两位小数。

输入样例:

-5

输出样例:

在这里给出相应的输出。例如:

25.00

……

#include<stdio.h>

int main()
{
    int year;
    char a,b,c;
    double t,s,x,y;
    scanf("%lf",&x);
    if(x<0)
    {
        y=x*x;
        printf("%.2lf",y);
    }
    else if(x>=0&&x<10)
    {
        printf("%.2lf",2*x-1);
    }
    else{
        printf("%.2lf",3*x-11);
    }
return 0;
}

7-14 判断10的倍数 (5 分)

输入一个整数a,如果a为10的倍数,则输出a;如果a不是10的倍数,什么也不输出。

输入格式:

直接输入1个整数,没有其他任何附加字符。

输出格式:

直接输出结果,没有其他任何附加字符。

输入样例:

在这里给出一组输入。例如:

20

输出样例:

在这里给出相应的输出。例如:

20

简单if   应用

#include<stdio.h>

int main()
{
    int year;
    int a,b,c;
    int t,s;
    scanf("%d",&a);
    if(a%10==0)
    {
        printf("%d",a);
    }


return 0;
}

### 关于浙江大学翁恺PTA平台练习题 在浙江大学翁恺老师的编程教学资源中,PTA(Programming Teaching Assistant)平台上提供了丰富的练习题目供学生实践和巩固所学知识。这些练习涵盖了多种编程语言,包括但不限于C语言和Java。 对于C语言的学习者来说,在PTA上可以找到一系列由翁恺设计的课后练习题[^1]。这类题目旨在帮助学习者掌握基础语法以及提高解决问题的能力。例如,“C语言-翁恺-PTA-41-80课后练习题-02”,该系列包含了不同难度级别的挑战项目,有助于逐步提升学生的编码技巧。 针对Java初学者,则有专门面向这门语言设置的任务集合[^2]。通过解决实际问题来加深理解,并熟练运用诸如`switch-case`这样的控制流结构。下面给出了一段简单的Java代码片段用于处理输入数值并根据不同条件输出相应结果: ```java import java.util.Scanner; public class Try2 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); double x; @SuppressWarnings("unused") double f; int r; x = scan.nextDouble(); if (x < 0) { r = 1; } else if (x == 0) { r = 2; } else { r = 3; } switch (r) { case 1: System.out.println(f = -1); break; case 2: System.out.println(f = 0); break; case 3: System.out.println(f = 2 * x); break; } scan.close(); } } ``` 此外,还有关于单位转换的实际应用案例可供参考。比如将英制长度转成公制长度的问题,可以通过给定公式`(foot + inch / 12) * 0.3048`实现从英尺加英寸到米之间的换算操作[^3]。 为了更好地利用这些资源进行自我训练,建议访问中国大学MOOC网站或直接登录PTA平台查找更多由翁恺教授编写的高质量习题集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值