从零开始的上机(2)

本次上机涉及内容:Python基础(I)(II)

等差数列末项计算

描述

给出一个等差数列的前两项 $a_1,a_2$,求第 $n$ 项是多少。

输入

一行,包含三个整数 $a_1,a_​2,n$ 。$-100 \leq a_1,a_​2 \leq 100,0 < n \leq 1000$ 。

1
1 4 100

输出

一个整数,即第 $n$ 项的值。

1
298

Solution

直接使用公式模拟即可。

1
2
3
4
5
6
7
lst = input().split()
a = int(lst[0])
b = int(lst[1])
c = int(lst[2])
d = b - a
res = a + (c - 1) * d
print(res)

苹果和虫子

描述

你买了一箱 $n$ 个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每 $x$ 小时能吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过 $y$ 小时你还有多少个完整的苹果?

输入

输入仅一行,包括 $n,x$ 和 $y$ (均为整数)。输入数据保证 $y \leq n \cdot x$ 。

1
10 4 9

输出

输出也仅一行,剩下的苹果个数

1
7

Solution

注意本题需要求完成的苹果数,因此直接按照题意模拟即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
lst = input().split()
n = int(lst[0])
x = int(lst[1])
y = int(lst[2])
if y % x == 0:
    d = y // x
    print(n - d)
elif y % x != 0:
    d = y // x + 1
    print(n - d)

与圆相关的计算

描述

给出圆的半径,求圆的直径、周长和面积。

输入

输入包含一个实数 $r(0 < r \leq 10000)$ ,表示圆的半径。

1
3.0

输出

输出一行,包含三个数,分别表示圆的直径、周长、面积,数与数之间以一个空格分开,每个数保留小数点后4位。

1
6.0000 18.8495 28.2743

Solution

这里的 $\pi$ 按照保留小数应该取 $3.14159$ ,而保留小数点后四位可以使用printf("%.4lf",...)的语句,接下来模拟即可,注意Python的默认print是换行,需要加上end=' '改变它的行为。

1
2
3
4
5
6
7
8
r = float(input())
pi = 3.14159
d = 2 * r
c = 2 * pi * r
s = pi * r * r
print(f"{d:.4f}", end=' ')
print(f"{c:.4f}", end=' ')
print(f"{s:.4f}")

判断能否被3,5,7整除

描述

给定一个整数,判断它能否被3,5,7整除,并输出以下信息:

1、能同时被3,5,7整除(直接输出3 5 7,每个数中间一个空格);

2、只能被其中两个数整除(输出两个数,小的在前,大的在后。例如:3 5或者 3 7或者5 7,中间用空格分隔);

3、只能被其中一个数整除(输出这个除数);

4、不能被任何数整除,输出小写字符‘n’,不包括单引号。

输入

输入一行,包括一个整数。

1
105

输出

输出一行,按照描述要求给出整数被3,5,7整除的情况。

1
3 5 7

Solution

就是条件判断,逐步按题意模拟即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
a = int(input())
if a % 3 == 0 and a % 5 == 0 and a % 7 == 0:
    print("3 5 7")
elif a % 3 == 0 and a % 5 == 0 and a % 7 != 0:
    print("3 5")
elif a % 3 == 0 and a % 7 == 0 and a % 5 != 0:
    print("3 7")
elif a % 5 == 0 and a % 7 == 0 and a % 3 != 0:
    print("5 7")
elif a % 3 == 0 and a % 5 != 0 and a % 7 != 0:
    print(3)
elif a % 5 == 0 and a % 3 != 0 and a % 7 != 0:
    print(5)
elif a % 7 == 0 and a % 5 != 0 and a % 3 != 0:
    print(7)
else:
    print('n')

奇偶ASCII值判断

描述

任意输入一个字符,判断其ASCII是否是奇数,若是,输出YES,否则,输出NO。

例如,字符A的ASCII值是65,则输出YES,若输入字符B(ASCII值是66),则输出NO。

输入

输入一个字符。

1
A

输出

如果其ASCII值为奇数,则输出YES,否则,输出NO。

1
YES

Solution

首先,应该使用ord函数来获取某个字符的ASCII值。

其次,因为输入的字符串可能是'\n',它会被py识别为换行符而非输入内容。

此时,要特判输入字符串是否为空串,即len=0。

1
2
3
4
5
6
7
8
9
x = input()
if len(x) == 0:
    print("NO")
else:
    res = ord(x)
    if res % 2 == 1:
        print("YES")
    else:
        print("NO")

判断闰年

描述

判断某年是否是闰年。

输入

输入只有一行,包含一个整数 $a(0 < a < 3000)$ 。

1
2006

输出

一行,如果公元 $a$ 年是闰年输出Y,否则输出N。

1
N

Solution

按照题意模拟即可。

1
2
3
4
5
6
7
x = int(input())
if x % 4 == 0 and x % 100 != 0:
    print('Y')
elif x % 4 == 0 and x % 400 == 0:
    print('Y')
else:
    print('N')

苹果与虫子2

你买了一箱 $n$ 个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每 $x$ 小时能吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过 $y$ 小时你还有多少个完整的苹果?

输入

输入仅一行,包括 $n,x$ 和 $y$(均为整数)。

1
10 4 9

输出

输出也仅一行,剩下的苹果个数。

1
7

Solution

按照题意模拟即可,注意本题没有 $y \leq n \cdot x$ 的限制,因此需要特判。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
lst = input().split()
n = int(lst[0])
x = int(lst[1])
y = int(lst[2])
if y >= n * x:
    print(0)
elif y % x == 0:
    d = y // x
    print(n - d)
elif y % x != 0:
    d = y // x + 1
    print(n - d)

满足条件的数累加

描述

将正整数 $m$ 和 $n$ 之间(包括 $m$ 和 $n$ )能被 $17$ 整除的数累加。其中, $0 < m < n < 1000$ 。

输入

一行,包含两个整数 $m$ 和 $n$ ,其间,以一个空格间隔。

1
50 85

输出

输出一行,包行一个整数,表示累加的结果。

1
204

Solution

使用循环,按照题意模拟即可。

1
2
3
4
5
6
7
8
lst = input().split()
m = int(lst[0])
n = int(lst[1])
ans = 0
for i in range(m, n + 1):
    if i % 17 == 0:
        ans += i
print(ans)

统计满足条件的四位数个数。

描述

给定若干个四位数,求出其中满足以下条件的数的个数:

个位数上的数字减去千位数上的数字,再减去百位数上的数字, 再减去十位数上的数字的结果大于零。

输入

输入为两行,第一行为四位数的个数 $n$ ,第二行为 $n$ 个的四位数,数与数之间以一个空格分开。 $(n <= 100)$

1
2
5
1234 1349 6119 2123 5017

输出

输出为一行,包含一个整数,表示满足条件的四位数的个数。

1
3

Solution

使用循环,按照题意模拟即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
n = int(input())
ans = 0
lst = input().split()
for i in range(0, n):
    x = int(lst[i])
    a = x % 10
    b = (x % 100 - a) // 10
    c = (x % 1000 - b * 10 - a) // 100
    d = x // 1000
    if a - d - c - b > 0:
        ans += 1
print(ans)

开关灯

描述

假设有 $N$ 盏灯( $N$ 为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有 $M$ 个人( $M$ 为不大于 $N$ 的正整数)也从1到 $M$ 依次编号。

第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。

请问:当第 $M$ 个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。

输入

输入正整数 $N$ 和 $M$ ,以单个空格隔开。

1
10 10

输出

顺次输出关闭的灯的编号,其间用逗号间隔。

1
1,4,9

Solution

看这个数据范围,使用循环直接遍历可以过,不需要使用容斥什么的。

但是,这里首先要说明开数组的方法,与C++中不同,Python中无法使用int a[n]这种语法开数组,因此应该用乘法进行实现。

同时,最后的join与遍历,也是Python方便的地方之一,这在上期博文中讲过了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
lst = input().split()
n = int(lst[0])
m = int(lst[1])
l = [1] * n
tem = []
for i in range(0, m):
    for j in range(0, n):
        if (j + 1) % (i + 1) == 0:
            if l[j] == 0:
                l[j] = 1
            elif l[j] == 1:
                l[j] = 0
        else:
            pass
for i in range(0, n):
    if l[i] == 0:
        tem.append(i + 1)
res = ",".join(str(item) for item in tem)
print(res)
本博客已稳定运行
发表了43篇文章 · 总计290.94k字
使用 Hugo 构建
主题 StackJimmy 设计