PAT程序设计题解

@

目录

7-1 PY圆面积

编写程序,输入圆的半径,计算圆的面积并输出。

提示:圆的计算公式为area=π×radius2,在这道题中,π取3.14159

输入格式:

输入为一个大于0的浮点数,表示圆的半径。

输出格式:

输出一个浮点数,小数点后输出两位,表示圆的面积。

输入样例:

3.2

输出样例:

32.17

radius = float(input())
pi = 3.14159
area = pi*radius**2
print("%.2f"%area)

7-2 求正弦值 输入角度

求正弦值。pi使用系统定义的pi值。

输入格式:

输入角度,小数

输出格式:

输出正弦值,保留两位小数

输入样例:

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

45

输出样例:

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

0.71

import math
i = float(input())
result = math.sin((math.pi/180)*i)
print("%.2f"%result)

7-3 PY时间差

10点半到11点45之间,有几小时几分钟呢?

你要写一个程序,读入两个时间,计算它们之间的时间差,输出相差几小时几分钟。

输入格式:

输入两行,分别表示两个时间,均以24小时制表达,每个时间以“小时 分钟”的形式表达,第二个时间一定比第一个时间晚或相同,而且一定在同一天内。

输出格式:

输出表示两个时间之间的时间差的两个数字,第一个数字是时间差中的小时数,第二个数字是时间差中的分钟数。

输入样例:

10 30

11 45

输出样例:

1 15

使用最简单的方式

def calculate(h,m):
    return h*60+m


old = input()
new = input()

old_h,old_s = map(int ,old.strip().split(" "))
new_h,new_s = map(int ,new.strip().split(" "))

res = calculate(new_h,new_s)-calculate(old_h,old_s)
print(f"{res//60} {res%60}")

利用date

from datetime import datetime

def calc_hours(old: str, new: str)->float:
    old_time = datetime.strptime(old, "%Y-%m-%d %H:%M:%S")
    new = datetime.strptime(new, "%Y-%m-%d %H:%M:%S")
    sec = (new - old_time).seconds
    return round(sec/3600, 3)


old = input().replace(" ", ":")
new = input().replace(" ", ":")
time_1 = f'2020-01-01 {old}:00'
time_2 = f'2020-01-01 {new}:00'
result = calc_hours(time_1, time_2)
if(result>1):
    integer = result%result+1
    decimal = (float(result)-float(integer))*60
print("%d %d"%(integer,decimal))

利用三方库numpy

from datetime import datetime
import numpy as np

def calc_hours(old: str, new: str)->float:
    old_time = datetime.strptime(old, "%Y-%m-%d %H:%M:%S")
    new = datetime.strptime(new, "%Y-%m-%d %H:%M:%S")
    sec = (new - old_time).seconds
    return round(sec/3600, 3)


old = input().replace(" ", ":")
new = input().replace(" ", ":")
time_1 = f'2020-01-01 {old}:00'
time_2 = f'2020-01-01 {new}:00'
result = calc_hours(time_1, time_2)
adecimal,integer=np.modf(result)
print(adecimal,integer)

7-2 计算存款利息

本题目要求计算存款利息,计算公式为interest=money×(1+rate)
year
−money,其中interest为存款到期时的利息(税前),money是存款金额,year是存期,rate是年利率。

输入格式:

输入在一行中顺序给出三个正实数money、year和rate,以空格分隔。

输出格式:

在一行中按“interest = 利息”的格式输出,其中利息保留两位小数。

输入样例:

1000 3 0.025

输出样例:

interest = 76.89

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

int main()
{
    //本题目要求计算存款利息,计算公式为interest=money*(1+rate)^year-money
    //其中interest为存款到期时的利息(税前),money是存款金额,year是存期,rate是年利率。

    //输入在一行中顺序给出三个正实数money、year和rate,以空格分隔。
    //在一行中按“interest = 利息”的格式输出,其中利息保留两位小数。
    //输入样例1000 3 0.025

    float money;
    float year;
    float rate;
    float interest;
    int result = scanf("%f %f %f", &money, &year, &rate);
    interest = money * powf(1 + rate, year) - money;
    printf("interest = %.2f\n", interest);
    return 0;
}

7-3 字符反序输出,并去ASCII码值之和

从键盘输入3个字符,将它们反向输出,并输出这3个字符ASCII码值之和。

输入格式:

在一行中输入3个字符,每个字符之间用空格分隔。

输出格式:
在一行中逆序输出3个字符,每个字符之间用空格分隔。在另一行中输出3个字符ASCII码值之和。

输入样例:

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

a b c

输出样例:

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

c b a
294

#include <stdio.h>
#include <string.h>

int get_ascii(char *str)
{
    int num  = 0;
    for (size_t i = 0; i < strlen(str); i++)
    {
        num +=str[i];

    }
    return num;

}
void main()
{
    char str[3];
    scanf("%s %s %s", str,str+1,str+2);
    printf("%c %c %c\n",str[2],str[1],str[0]);
    int result = get_ascii(str);
    printf("%d",result);

}

7-1 计算圆球体积

设圆球的半径为r,计算并输出圆球体积v。输出结果保留2位小数。提示:计算圆球的体积公式为:v=
3
4

πr
3
(π=3.14)

输入格式:

输入第一行给出一个正整数半径r(0< r ≤ 100)。

输出格式:
圆球的体积v保留两位小数。

输入样例:

5

输出样例:

v = 523.33

#include <stdio.h>
#include <math.h>
#define PI 3.14f

int main()
{
    int  r;
    scanf("%d",&r);
    float v = (4/3.0f) * PI * powf(r, 3);
    printf("v = %.2f", v);
    return 0;
}

7-1 大小写字符转换

分数 10
作者 齐心
单位 湖北汽车工业学院
输入一个字符,如果是大写字母,将它转换成小写字母并输出;如果是小写字母,将它转换成大写字母并输出;如果都不是,则输出:error

输入样例:

a

输出样例:

A

输入样例:

B

输出样例:

b

输入样例:

1

输出样例:

error

#include <stdio.h>

int main()
{
    char msg;
    scanf("%c", &msg);
    if ('A' <= msg && msg <= 'Z')
    {
        msg = msg + 32;
        printf("%c", msg);
    }
    else if ('a' <= msg && msg <= 'b')
    {
        msg = msg - 32;
        printf("%c", msg);
    }
    else
    {
        printf("error");
    }

    return 0;
}

7-4 计算工资

分数 10
作者 沈睿
单位 浙江大学
某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。

输入格式:
输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。

输出格式:
在一行输出该员工的周薪,精确到小数点后2位。

输入样例1:

5 40

输出样例1:

2000.00

输入样例2:

3 50

输出样例2:

1650.00

#include <stdio.h>
int calculate(int year, int weekHour)
{
    int price;
    float salary;
    if (year >= 5)
    {
        price = 50;
        salary = weekHour > 40 ? (weekHour - 40) * 1.5 * price + 2000 : weekHour * price;
        printf("%.2f\n", salary);
    }
    else
    {
        price = 30;

        salary = weekHour > 40 ? (weekHour - 40) * 1.5 * price + 1200 : weekHour * price;
        printf("%.2f\n", salary);
    }

    return 0;
}

int main()
{
    // 入职年数
    int year;
    // 周工作时间
    int weekHour;
    // 工资
    float salary;
    scanf("%d %d", &year, &weekHour);
    calculate(year, weekHour);
    return 0;
}

7-3 计算符号函数的值

分数 10
作者 C课程组
单位 浙江大学
对于任一整数n,符号函数sign(n)的定义如下:

请编写程序计算该函数对任一输入整数的值。

输入格式:

输入在一行中给出整数n。

输出格式:
在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。

输入样例1:

10

输出样例1:

sign(10) = 1

输入样例2:

0

输出样例2:

sign(0) = 0

输入样例3:

-98

输出样例3:

sign(-98) = -1

#include <stdio.h>

int sign(int n)
{
    if (n < 0)
    {
        return -1;
    }
    else if (n == 0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}
int main()
{
    int num;
    scanf("%d", &num);
    printf("sign(%d) = %d", num, sign(num));
    return 0;
}

7-1 统计学生成绩

分数 10
作者 陈建海
单位 浙江大学
本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:

大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。

输入格式:

输入在第一行中给出一个正整数N(≤1000),即学生人数;第二行中给出N个学生的百分制成绩,其间以空格分隔。

输出格式:
在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。

输入样例:

7
77 54 92 73 60 65 69

输出样例:

1 0 2 3 1

#include <stdio.h>

void judge(int score, int *grade)
{
    if (score >= 90)
    {
        grade[0]++;
    }
    else if (score < 90 && score >= 80)
    {
        grade[1]++;
    }
    else if (score < 80 && score >= 70)
    {
        grade[2]++;
    }
    else if (score < 70 && score >= 60)
    {
        grade[3]++;
    }
    else if (score < 60)
    {
        grade[4]++;
    }
}

int main()
{
    // 分数
    int score;
    // 装成绩成绩人数分布,初始化
    int grade[5];
    for (size_t i = 0; i < 5; i++)
    {
        grade[i] = 0;
    }

    // 读取人数
    int times;
    scanf("%d", &times);
    // 循环读取分数
    for (size_t i = 0; i < times; i++)
    {
        scanf("%d", &score);
        judge(score, grade);
    }

    for (size_t i = 0; i < 5; i++)
    {
        if (i == 0)
        {
            printf("%d", grade[i]);
        }
        else
        {
            printf(" %d", grade[i]);
        }
    }

    return 0;
}

7-3 统计素数并求和

分数 10
作者 张彤彧
单位 浙江大学
本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:

输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:

10 31

输出样例:

7 143

#include <stdio.h>

int judge(int i, int *sum)
{
    // 判断i是否为素数
    int o = 2;
    for (; o < i; o++)
    {
        // 符合此条件则不为素数
        if (i % o == 0)
        {
            return 0;
        }
    }
    // 如果为素数,则返回1,并累计加和。
    *sum += i;
    return 1;
}

int main()
{
    // 本题要求统计给定整数M和N区间内素数的个数并对它们求和。
    // 输入样例10 31 正整数M和N

    int m, n, flag, i, total, sum;
    total = flag = sum = 0;
    scanf("%d %d", &m, &n);

    // 外循环m到n个数字
    for (i = m; i <= n; i++)
    {
        if (i == 1)
        {
            continue;
        }
        // 如果判断为素数,那么素数总数加一
        if (judge(i, &sum) == 1)
            total++;
    }
    printf("%d %d\n", total, sum);
    return 0;
}

7-1 重要的话说三遍

这道超级简单的题目没有任何输入。

你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了。

注意每遍占一行,除了每行的回车不能有任何多余字符。

#include <stdio.h>

int main()
{
    for (size_t i = 0; i < 3; i++)
    {
        printf("I'm gonna WIN!");
        if (i<2)
        {
            putchar('\n');
        }

    }

    return 0;
}

7-2 输出倒三角图案

本题要求编写程序,输出指定的由“*”组成的倒三角图案。

输入格式:

本题目没有输入。

输出格式:

按照下列格式输出由“*”组成的倒三角图案。

简单实现

#include <stdio.h>

int main()
{
    printf("* * * *\n");
    printf(" * * *\n");
    printf("  * *\n");
    printf("   *");
    return 0;
}

稍微复杂的代码

#include <stdio.h>
int main()
{

    int i, j;
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < i; j++)
            putchar(' '); // 前面的空格
        for (j = 4 - j; j > 0; j--)
        {
            putchar('*');
            putchar(' '); // 中间的空格
        }
        if (i != 3)
        {
            putchar('\n');
        }
    }
    return 0;
}

7-3 打印菜单

本题要求编写程序,在屏幕上打印5行菜单。

输入格式:

本题目没有输入。

输出格式:

按照下列格式打印菜单,每行显示一句。注意除了每行的换行不能有任何多余字符。

[1] Select crisps

[2] Select popcorn

[3] Select chocolate

[4] Select cola

[0] Exit

#include <stdio.h>
int main()
{
    char *message = "Select";
    printf("[1] %s crisps\n", message);
    printf("[2] %s popcorn\n", message);
    printf("[3] %s chocolate\n", message);
    printf("[4] %s cola\n", message);
    printf("[0] Exit\n");

    return 0;
}

7-2 介绍一下你自己

本题目要求输入你的姓名、年龄和籍贯,然后输出一个自我介绍的字符串。

输入格式:

输入你的姓名、年龄和籍贯。

输出格式:

对每一组输入,在一行中输出一个自我介绍的字符串。

输入样例:

小明

20

北京

输出样例:

大家好!我是小明,今年20岁,来自北京。

name = input()
age = input()
place = input()
msg = f"大家好!我是{name},今年{age}岁,来自{place}。"
print(msg)

7-3 美化姓名

输入姓名,美化后输出。

输入格式:

输入一个姓名,如“张无忌”、“哪吒”、“Fiona

输出格式:

在姓名的左右各加上一个星号,如“*张无忌*”、“*哪吒*”、“*Fiona*

输入样例:

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

Tom

输出样例:

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

Tom

msg = input()
print(f"*{msg}*")

7-4 半圆弧的长度

输入圆的半径,求半圆弧的长度(使用math库的pi常量)

输入格式:

输入圆的半径,可以是小数,也可以是整数。

输出格式:

输出结果,要求结果保留2位小数。输出格式为:L=×××

输入样例:

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

2

输出样例:

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

L=6.28

from math import pi
receive = float(input())*pi
print("L=%.2f"%receive,end='')

7-5 输出工资表

现要求打印一份员工工资,输入员工的姓名、每小时收入、工作时长,税率和养老金比例,计算员工的净收入并输出相应的信息。
员工的工资 = 每小时收入 * 工作时长
税费 = 工资 * 税率
养老金 = 工资 * 养老金比例
净收入 = 工资 - 税费 - 养老金

输入格式:

输入共5行,每一行依次为员工的姓名、工作时长、每小时收入、税率和养老金比例

输出格式:

依次在每一行输出:姓名、工作小时、每小时收入、工资、扣除金额、净收入

输入样例:

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

于敏

8

110

0.1

0.05

输出样例:

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

Employee Name: 于敏

Hours Worked: 8

Pay Rate: $110

Gross Pay: $880

Deductions: 132.0

Net Pay:748.0

def calculate():

    # 姓名
    name = input()
    # 工作时长
    durable = int(input())
    # 每小时收入
    hourly_revenue = int(input())
    # 税率
    rate = float(input())
    # 养老金比例
    pension_rate = float(input())

    """
    员工的工资 = 每小时收入 * 工作时长
    税费 = 工资 * 税率
    养老金 = 工资 * 养老金比例
    净收入 = 工资 - 税费 - 养老金
    """
    salary = hourly_revenue*durable
    rate_free = salary*rate
    pension = salary*pension_rate
    net_income = salary-rate_free-pension
    out = '''Employee Name: {0}

Hours Worked:  {1}
Pay Rate: ${2}
Gross Pay: ${3}
Deductions: {4}
Net Pay:{5}'''.format(name,durable,hourly_revenue,salary,rate_free+pension,net_income)
    print(out)

if __name__=="__main__":
    calculate()

7-2 逆序的三位数

分数 5
作者 翁恺
单位 浙江大学
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

输入格式:

每个测试是一个3位的正整数。

输出格式:

输出按位逆序的数。

输入样例:

123

输出样例:

321

#include <stdio.h>

int main()
{
    int num, ge, shi, bai;
    scanf("%d", &num);
    bai = (num - num % 100) / 100;
    ge = (num - bai * 100) % 10;
    shi = (num - bai * 100 - ge) / 10;
    num = bai + shi * 10 + ge * 100;
    printf("%d\n", num);
    return 0;
}

7-3 厘米换算英尺英寸

分数 5
作者 翁恺
单位 浙江大学
如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。

输入格式:

输入在一行中给出1个正整数,单位是厘米。

输出格式:

在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。

输入样例:

170

输出样例:

5 6

#include <stdio.h>
#include <math.h>
int main()
{
    int inch, cm, left, right;
    float foot;
    scanf("%d", &cm);
    foot = cm / 30.48;
    left = floor(foot);
    right = floor((foot - left) * 12);
    printf("%d %d", left, right);
    return 0;
}

7-1 出租车计价

分数 10
作者 沈睿
单位 浙江大学
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

起步里程为3公里,起步费10元;
超起步里程后10公里内,每公里2元;
超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。
输入格式:
输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。

输出格式:

在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

输入样例1:

2.6 2

输出样例1:

10

输入样例2:

5.1 4

输出样例2:

14

输入样例3:

12.5 9

输出样例3:

34

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

int main()
{
    float price, distance;
    int result, wait_time, wait_price;
    scanf("%f %d", &distance, &wait_time);
    if (distance <= 3)
    {
        price += 10;
    }
    else if (3 < distance && distance <= 10)
    {
        price = (distance - 3) * 2 + 10;
    }
    else
    {
        price = 24 + (distance - 10) * 3;
    }

    wait_price = wait_time >= 5 ? wait_time / 5 * 2 : 0;
    price += wait_price;

    result = round(price);
    printf("%d\n", result);

    return 0;
}

7-2 计算油费

分数 10
作者 颜晖
单位 浙大城市学院
现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。

本题要求编写程序,根据输入顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助),计算并输出应付款。

输入格式:

输入在一行中给出两个整数和一个字符,分别表示顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助)。

输出格式:

在一行中输出应付款额,保留小数点后2位。

输入样例:

40 97 m

输出样例:

301.34

#include <stdio.h>
int main()
{
    int oil, oil_variety;
    char server_type;
    float total, count, price;

    scanf("%d %d %c", &oil, &oil_variety, &server_type);

    switch (oil_variety)
    {
    case 97:
        price = 7.93;
        break;
    case 93:
        price = 7.44;
        break;
    default:
        price = 6.95;
        break;
    }

    if (server_type == 'm')
        count = 0.95;
    else
        count = 0.97;

    total = price * oil * count;
    printf("%.2f\n", total);
    return 0;
}

6-1 符号函数

分数 5
作者 张高燕
单位 浙大城市学院
本题要求实现符号函数sign(x)。

函数接口定义:

int sign( int x );

其中x是用户传入的整型参数。符号函数的定义为:若x大于0,sign(x) = 1;若x等于0,sign(x) = 0;否则,sign(x) = −1。

裁判测试程序样例:

#include <stdio.h>

int sign( int x );

int main()
{
    int x;

    scanf("%d", &x);
    printf("sign(%d) = %d\n", x, sign(x));
    
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

10

输出样例:

sign(10) = 1

int sign(int x)
{
	if(x<0)
	{
		return -1;
	}
	else if(x==0)
	{
		return 0;
	}
	else
	{
		return 1;
	}
	return 0;
}

6-2 分数分段

分数 5
作者 裘君
单位 浙大宁波理工学院
请编写一个函数char CalFun(int x),从键盘上输入一个百分制成绩score,按下列原则输出其等级:score≥90,等级为A;80≤score<90,等级为B;70≤score<80,等级为C;60≤score<70,等级为D;score<60,等级为E。

函数接口定义:

char CalFun(int x);

x为输入的分数,返回等级信息

裁判测试程序样例:

#include <stdio.h>

char CalFun(int x);

int main(int argc, char *argv[]) {
    int x;
    printf("please input score:");
    scanf("%d",&x);
    printf("grade is:%c",CalFun(x));
    return 0;
}

/* 请在这里填写答案 */

输入样例:

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

95

输出样例:

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

grade is:A

输入样例:

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

86

输出样例:

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

grade is:B

输入样例:

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

55

输出样例:

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

grade is:E

char CalFun(int x)
{


	if(60<=x && x<70)
		return 'D';
	else if(70<=x && x<80)
		return 'C';
	else if(80<=x&&x<90)
		return 'B';
	else if(x>=90)
		return 'A';
	else
		return 'E';

}

7-2 完美的素数

分数 10
作者 伍建全
单位 重庆科技学院
一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。从键盘输入一系列正整数,输入以0结束。按输入顺序输出这些数中的美素数。数据保证输入序列中至少有1个美素数。

输入格式:

从键盘输入一系列正整数,输入 0 表示输入结束。

输出格式:

按输入顺序输出这些数中的美素数。每个数占一行。

输入样例:

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

11 12 13 17 19 21 23 0

输出样例:

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

11
23
代码长度限制
16 KB
时间限制
400 ms
内存限制

代码实现

#include<stdio.h>
typedef enum bool { false, true }bool;
bool isprimer(int num);
int  split_num(int num);

int main() {
	//接收用户输入
	int  num = 1, i = 0, j;

	while (1) {
		scanf("%d", &num);
		if (num == 0)
			break;
		else
		{
			if (isprimer(num) && isprimer(split_num(num)))
				printf("%d\n", num);
		}
	}

	return 0;
}

bool isprimer(int num) {
	int i;
	if (num == 1)
		return true;

	for (i = 2; i <= num - 1; i++) {
		if (num % i == 0)
			return false;
	}
	return true;
}

int  split_num(int num) {
	int i, sum = 0, arr[100] = { 0 };
	for (i = 1; num > 0; i++) {
		arr[i + 1] = num / 10;
		arr[i] = num % 10;
		num /= 10;
	}

	arr[0] = i - 1;

	for (i = 1; i <= arr[0]; i++)
	{
		sum += arr[i];
	}
	return sum;
}
posted @ 2022-10-07 22:43  蠢蛋快跑  阅读(2391)  评论(0)    收藏  举报