Python练习2024.02.04

洛谷(仅用于个人学习)

# 【深基4.例4】一尺之棰

## 题目描述

《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 $a$ 的木棍,从第二天开始,每天都要将这根木棍锯掉一半(每次除 $2$,向下取整)。第几天的时候木棍的长度会变为 $1$?

## 输入格式

输入一个正整数 $a$,表示木棍长度。

## 输出格式

输出一个正整数,表示要第几天的时候木棍长度会变为 $1$。

a=int(input())
count=1
while a!=1:
    a=a//2
    count+=1

print(count)

总结:python中没有++自增,而是要写成+=1。然后向下取整是//。

# 小玉在游泳

## 题目描述

小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 $2$ 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 $98\%$。现在小玉想知道,如果要游到距离 $s$ 米的地方,她需要游多少步呢。请你编程解决这个问题。

## 输入格式

输入一个实数 $s$(单位:米),表示要游的目标距离。

## 输出格式

输出一个整数,表示小玉一共需要游多少步。

s=float(input())
x=2
count=0
while s>0:
    s -= x
    x *= 0.98
    count += 1
print(count)

总结 :一开始是写成了s=int(input()),但是输入值可以是一位小数,所以要写成float。

# 【深基4.习5】求极差 / 最大跨度值

## 题目描述

给出 $n$ 和 $n$ 个整数 $a_i$,求这 $n$ 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。

## 输入格式

第一行输入一个正整数 $n$,表示整数个数。

第二行输入 $n$ 个整数 $a_1,a_2 \dots a_n$,以空格隔开。

## 输出格式

输出一个整数,表示这 $n$ 个整数的极差。

n=int(input())
L=list(map(int,input().split()))
a=max(L)
b=min(L)
print(a-b)

 

# 【XR-3】等差数列

## 题目描述

小 X 给了你一个等差数列的前两项以及项数,请你求出这个等差数列各项之和。

等差数列:对于一个 $n$ 项数列 $a$,如果满足对于任意 $i \in [1,n)$,有 $a_{i+1} - a_i = d$,其中 $d$ 为定值,则称这个数列为一个等差数列。

## 输入格式

一行 $3$ 个整数 $a_1, a_2, n$,表示等差数列的第 $1,2$ 项以及项数。

**数据范围:**

- $|a_1|,|a_2| \le 10^6$。
- $3 \le n \le 10^6$。

## 输出格式

一行一个整数,表示答案。

一开始写了一个利用等差公式求和的代码 

a1,a2,n=map(int,input().split())
d=a2-a1
s=a1*n+(n*(n-1)*d)/2
print(s)

然后提交运行,出现错误,以为是因为s得到的值是小数的原因,然后就将s转换为int,还是不行。(就是 s=int(a1*n+(n*(n-1)*d)/2)

看到题解中是用了列表,然后直接sum()求和。所以我也就想试一下。

a1,a2,n=map(int,input().split())
list=[a1,a2]
d=a2-a1
for i in range(2,n):
    list.append(list[i-1]+d)
print(sum(list))

其实我感觉我这样写没什么问题了,在IDLE上自己运行是没问题的,但是提交答案在洛谷上面就显示编译错误,不是很懂为什么。

然后在想可能是不是因为用了list这个名称,就换了种下面这样的方式,但是还是不行。

l=list(map(int,input().split()))
L=[l[0],l[1]]
d=l[1]-l[0]
for i in range(2,l[2]):
    L.append(L[i-1]+d)
print(sum(L))

放弃了。。。。。

 

# [CSP-J2019] 数字游戏

## 题目描述

小 K 同学向小 P 同学发送了一个长度为 $8$ 的 **01 字符串**来玩数字游戏,小 P 同学想要知道字符串中究竟有多少个 $1$。

注意:01 字符串为每一个字符是 $0$ 或者 $1$ 的字符串,如 `101` 为一个长度为 $3$ 的 01 字符串。

## 输入格式

输入文件只有一行,一个长度为 $8$ 的 01 字符串 $s$。

## 输出格式

输出文件只有一行,包含一个整数,即 01 字符串中**字符 $\mathbf 1$** 的个数。 

s=input()
count=0
for i in range(0,8):
    if s[i:i+1]=='1':
        count += 1
    else:
        continue
print(count)

 总结:一开始在判断语句那里忘了加引号,就是它是字符串,所以应该是'1',而不是单纯一个1。

# [NOIP2011 普及组] 数字反转

## 题目描述

给定一个整数 $N$,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。

## 输入格式

一个整数 $N$。

## 输出格式

一个整数,表示反转后的新数。

N=input()
flag=0
if N[0]=='-':
    N1=N[1:]
    N1=N1[::-1]
    flag=1
else:
    N1=N[::-1]
    
x=0
for i in range(0,len(N1)):
    if N1[i]=='0':
        x += 1
        continue
    else:
        break
N2=N1[x:]

if flag==1:
    print(-int(N2))
else:
    print(int(N2))

总结:纳闷,写了好久,一开始只是可以转换正整数,负的数无法翻转,然后后面注意到了负数前面有个负号,但是!!!!为什么我这个运行提交后,11个测试点AC了,但是有一个测试点RE,不知道为什么超时。。。。

# 【深基4.例6】数字直角三角形

## 题目描述

给出 $n$,请输出一个直角边长度是 $n$ 的数字直角三角形。所有数字都是 $2$ 位组成的,如果没有 $2$ 位则加上前导 $0$。

## 输入格式

输入一个正整数 $n$。

## 输出格式

输出如题目要求的数字直角三角形。

n=int(input())
x=0
for i in range(0,n):
    for j in range(i,n):
        x += 1
        if x<10:
            print('0',end='')
        print(x,end='')
    print()

 感觉代码没问题,在IDLE上运行也没问题,但是在洛谷上面提交就说编译错误。

知识点:在Python中,如果想在输出时不换行,可以使用end参数。默认情况下,print函数会在每次调用后自动换行,但可以通过将end参数设置为空字符串('')来禁用此行为。

# 阶乘之和

## 题目描述

计算     S=1!+2!+3!+⋯+n!(n≤20)

其中 ! 表示阶乘,定义为 n!=n×(n−1)×(n−2)×⋯×1

例如,5!=5×4×3×2×1=120。

## 输入格式

一个正整数 n

## 输出格式

一个正整数 S,表示计算结果。

n=int(input())
l=[]
for i in range(1,n+1):
    a=1
    for j in range(1,i+1):
        a *= j
    l.append(a)
print(sum(l))

这是一开始自己写的,感觉没问题,运行下来得到的结果也都是正确的。但是提交的时候就是编译错误。。。

def f(n):
    if n==0 or n==1:
        return 1
    else:
        return n*f(n-1)

n=int(input())
s=0
for i in range(1,n+1):
    s += f(i)
print(s)

 这是后面查了一下写的,就AC了。就是用了一个函数来定义阶乘,但是我感觉明明就是可以用两个循环来实现,也是不知道为什么会编译错误。不过也是学到了一种方法吧,就是可以先定义函数。

# [NOIP2013 普及组] 计数问题

## 题目背景

NOIP2013 普及组 T1

## 题目描述

试计算在区间 $1$ 到 $n$ 的所有整数中,数字 $x$($0\le x\le9$)共出现了多少次?例如,在 $1$ 到 $11$ 中,即在 $1,2,3,4,5,6,7,8,9,10,11$ 中,数字 $1$ 出现了 $4$ 次。

## 输入格式

$2$ 个整数 $n,x$,之间用一个空格隔开。

## 输出格式

$1$ 个整数,表示 $x$ 出现的次数。

又是一道不是很会的题目

a=input().split()
n=int(a[0])
x=a[1]
count=0
s=[]
for i in range(1,n+1):
    s.append(i)
r=''.join([str(i) for i in s])
for j in r:
    if j=='x':
        count += 1
        continue
print(count)

自己写的代码,不能得到正确的结果,问题应该就是出在转换字符串和转换整数这两个之间。

查了之后,写了一个可以得到结果的:

def count(n,x):
    s=''.join(str(i) for i in range(1,n+1))
    count=0
    for i in s:
        if int(i)==x:
            count+=1
    return count

a=input().split()
n=int(a[0])
x=int(a[1])
print(count(n,x))

知识点:

在Python中,将列表转换为字符串的方法有很多种,下面是一些常见的方法:

使用 join() 方法

join() 是字符串的一个方法,可以将一个可迭代的对象(如列表)中的元素连接为一个字符串。

my_list = ['a', 'b', 'c', 'd']  
my_string = ''.join(my_list)  
print(my_string)  # 输出:'abcd'

仅用于自己备赛学习,手下留情。 

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值