CSDN编程题-每日一练(2023-08-24)
一、题目名称:计算公式
时间限制:1000ms内存限制:256M
题目描述:
给定整数n。 计算公式: n i-1
∑ ∑ [gcd(i + j, i - j) = 1]
i=1 j=1
输入描述:
输入整数n。(1<=n<=1e6)
输出描述:
输出答案
🚩 示例:
✔️ 示例1 :
输入
233
输出
11065
🔔 解题思路:
首先,我们需要明确计算公式的含义。公式中的i和j都是从1开始的,并且满足gcd(i + j, i - j) = 1。我们需要计算一个双重求和的公式。
代码如下:
python
import math
def calc(n):
result = 0
for i in range(1, n+1):
for k in range(1, (i//2) + 1):
if math.gcd(i+k, i-k) == 1:
result += 2
return result
n = int(input())
print(calc(n))
二、题目名称:蛇形矩阵
时间限制:1000ms内存限制:256M
题目描述:
给你一个整数n,输出n∗n的蛇形矩阵。
输入描述:
输入一行,包含一个整数n
输出描述:
输出n行,每行包含n个正整数,通过空格分隔。
🚩示例:
✔️示例1
输入
4
输出
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
🔔 解题思路:
生成n∗n的蛇形矩阵。根据蛇形矩阵的生成规则,从左上角开始按照顺序填充矩阵。
代码1如下:
python
n = int(input())
def snake_matrix(n):
##创建一个 n × n 的二维列表 arr ,并初始化所有元素为0。arr 表示蛇形矩阵
arr = [[0] * n for _ in range(n)]
num = 1 ##变量 num 表示当前要填入蛇形矩阵的数字,初始值为1
row, col = 0, 0 ##变量 row 和 col 表示当前位置的行号和列号,初始值为0
##循环从 1 到 n × n 遍历每个数字,将其填入蛇形矩阵中
for i in range(1, n*n+1):
##在每次循环中,首先将当前数字 num 填入蛇形矩阵的当前位置 (row, col)
arr[row][col] = num
##然后将num加1
num += 1
##根据当前位置 (row, col) 的行号与列号之和 (row + col) 的奇偶性,确定下一个位置的移动方向
##1、当 (row + col) 为偶数时,向右上方移动
if (row + col) % 2 == 0:
##具体判断条件为:
##如果当前列号 col 小于 n - 1 并且当前行号 row 大于0,则向右上方移动,即列号加1,行号减1
if col < n - 1 and row > 0:
col += 1
row -= 1
##如果当前列号 col 小于 n - 1,但当前行号 row 已经达到最小值0,则只能向右移动,即列号加1
elif col < n - 1:
col += 1
##否则,当前列号 col 达到最大值 n - 1,只能向下移动,即行号加1
else:
row += 1
##2、当 (row + col) 为奇数时,向左下方移动
else:
#如果当前行号 row 小于 n - 1 并且当前列号 col 大于0,则向左下方移动,即行号加1,列号减1
if row < n - 1 and col > 0:
row += 1
col -= 1
##如果当前行号 row 小于 n - 1,但当前列号 col 已经达到最小值0,则只能向下移动,即行号加1
elif row < n - 1:
row += 1
###否则,当前行号 row 达到最大值 n - 1,只能向右移动,即列号加1
else:
col += 1
##遍历结束后,返回构造好的蛇形矩阵 arr
return arr
arr = snake_matrix(n)
##最后,按指定格式输出蛇形矩阵。遍历 arr 的每一行,并使用空格分隔每个数字,将其打印输出
for row in arr:
print(' '.join(str(num) for num in row))
代码2如下:
python
## n ---蛇形矩阵的大小
n = int(input())
def snake_matrix(n):
###创建一个 n × n 的二维列表 matrix,并初始化所有元素为 0。这个二维列表表示蛇形矩阵
matrix = [[0] * n for _ in range(n)]
num = 0 ##变量 num 表示当前要填入蛇形矩阵的数字,初始值为 0
arr = [] ##空列表 arr,用于存储每一行的数字序列
##循环从 1 到 2n-1 遍历每一行,i 表示当前行号
for i in range(1, n * 2):
arr.append([]) #新增一个空列表,用于存储当前行的数字序列
##根据不同的行号 i,使用条件判断进行不同的遍历方式:
## 1、如果当前行号 i 小于等于 n,则遍历范围为 0 到 i-1,即列数与行号相同。在这个范围内,逐个填入数字,同时更新 num 的值,并将数字添加到 arr[-1] 中。
## 2、否则,当前行号 i 大于 n,则遍历范围为 0 到 2n-i-1,即列数等于 2n-1 减去行号 i。同样地,在这个范围内逐个填入数字,并进行相应的更新操作。
if i <= n:
for j in range(i):
num += 1
arr[-1].append(num)
else:
for j in range(2 * n - i):
num += 1
arr[-1].append(num)
##在每一行填充数字时,如果当前行号 i 是偶数(i % 2 == 0),说明该行需要进行反转操作(从高到低的顺序),所以将 arr[-1] 反转
if i % 2 == 0:
arr[-1] = arr[-1][::-1]
##使用两个嵌套的循环 for i in range(n) 和 for j in range(n),遍历矩阵的每个位置。并将 arr[j + i].pop() 的值赋给 matrix[i][j],用于填充蛇形矩阵。
for i in range(n):
for j in range(n):
matrix[i][j] = arr[j + i].pop()
return matrix
##函数返回生成的蛇形矩阵 matrix
matrix = snake_matrix(n)
##使用循环打印输出蛇形矩阵中的每一行,通过 ' '.join(str(num) for num in row) 将每个数字转换为字符串,并用空格连接起来,实现按行打印输出
for row in matrix:
print(' '.join(str(num) for num in row))
🔔 题目变形1:
🚩示例:
✔️示例1
输入
4
输出
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
python
def snake_matrix(n):
matrix = [[0] * n for _ in range(n)]
num = 1
k = 0
while k < n:
i, j = k, k
# 向右移动填充数字
while j < n and matrix[i][j] == 0:
matrix[i][j] = num
num += 1
j += 1
j -= 1
i += 1
# 向下移动填充数字
while i < n and matrix[i][j] == 0:
matrix[i][j] = num
num += 1
i += 1
i -= 1
j -= 1
# 向左移动填充数字
while j >= 0 and matrix[i][j] == 0:
matrix[i][j] = num
num += 1
j -= 1
j += 1
i -= 1
# 向上移动填充数字
while i >= 0 and matrix[i][j] == 0:
matrix[i][j] = num
num += 1
i -= 1
k += 1
return matrix
n = int(input())
matrix = snake_matrix(n)
for row in matrix:
print(' '.join(str(num) for num in row))
🔔 题目变形2:
🚩示例:
✔️示例1
输入
4
输出
1 8 9 16
2 7 10 15
3 6 11 14
4 5 12 13
python
def snake_matrix(n):
matrix = [[0] * n for _ in range(n)]
num = 1
for i in range(n):
if i % 2 == 0:
for j in range(n):
matrix[j][i] = num
num += 1
else:
for j in range(n-1, -1, -1):
matrix[j][i] = num
num += 1
return matrix
n = int(input())
matrix = snake_matrix(n)
for row in matrix:
print(' '.join(str(num) for num in row))
🔔 题目变形3:
🚩示例:
✔️示例1
输入
4
输出
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
python
def snake_matrix(n):
matrix = [[0] * n for _ in range(n)]
num = 1
for i in range(n):
if i % 2 == 0:
for j in range(n):
matrix[i][j] = num
num += 1
else:
for j in range(n-1, -1, -1):
matrix[i][j] = num
num += 1
return matrix
n = int(input())
matrix = snake_matrix(n)
for row in matrix:
print(' '.join(str(num) for num in row))
三、题目名称:小玉家的电费
时间限制:1000ms内存限制:256M
题目描述:
夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了。小玉家今天收到了一份电费通知单。小玉看到上面写:据闽价电[2006]27号规定,月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行,月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行,月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行;小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。
输入描述:
输入一个整数,表示用电总计(单位以千瓦时计),不超过10000。
输出描述:
输出一个数,保留到小数点后1位(单位以元计,保留到小数点后1位)。
🚩示例:
✔️示例1
输入
267
输出
121.5
🔔 解题思路:
根据输入的用电总计,按照规定的电价计算电费金额。
具体电费金额计算如下:
1、如果用电总计 <= 150,电费金额 = 用电总计 * 0.4463;
2、如果用电总计 > 150 且 <= 400,电费金额 = (150 * 0.4463) + ((用电总计 - 150) * 0.4663);
3、如果用电总计 > 400,电费金额 = (150 * 0.4463) + (250 * 0.4663) + ((用电总计 - 400) * 0.5663);
代码1如下:
python
def calc(total_power):
if total_power <= 150:
return round(total_power * 0.4463, 1)
elif total_power > 150 and total_power <= 400:
return round((150 * 0.4463) + ((total_power - 150) * 0.4663), 1)
else:
return round((150 * 0.4463) + (250 * 0.4663) + ((total_power - 400) * 0.5663), 1)
total_power = int(input())
pay = calc(total_power)
print(pay)
代码2如下:
python
#include <stdio.h>
#include <stdlib.h>
void solution(int total_power) {
double pay = 0;
if (total_power <= 150) {
pay = total_power * 0.4463;
}
else if(total_power <= 400) {
pay = 150 * 0.4463 + (total_power - 150) * 0.4663;
}
else {
pay = 150 * 0.4463 + 250 * 0.4663 + (total_power - 400) * 0.5663;
}
printf("%0.1f",pay);
}
int main() {
int total_power;
scanf("%d", &total_power);
solution(total_power);
return 0;
}
代码3如下:
python
# 请关闭中文输入法,用英文的字母和标点符号。
# 如果你想运行系统测试用例,请点击【执行代码】按钮,如果你想提交作答结果,请点击【提交】按钮,
# 注意:除答案外,请不要打印其他任何多余的字符,以免影响结果验证
# 本OJ系统是基于 OxCoder 技术开发,网址:www.oxcoder.com
# 模版代码提供基本的输入输出框架,可按个人代码习惯修改
class Solution:
def __init__(self) -> None:
pass
def solution(self, amount):
result = None
# TODO: 请在此编写代码
if amount <=150:
result=amount*0.4463
elif amount <=400 and amount>150:
result=150*.4463+(amount-150)*0.4663
elif amount>400:
result = 150 * .4463 + (400 - 150) * 0.4663+(amount-400)*0.5663
return round(result, 1)
if __name__ == "__main__":
amount = int(input().strip())
sol = Solution()
result = sol.solution(amount)
print(result)