洛谷入门题 - 3

2019-10-25 Views 洛谷 编程1291字6 min read

本系列文章选取大量新手村题目,为初学者讲解编程的一些相关技巧。本文使用的编程语言为 python,总共 5 道题,涵盖顺序与分支、循环和数组、字符串等内容。
本文涉及的题目:P1075、P1598、P1914、P2141、P1308

P1075

已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数。
要寻找这个质数我们只能通过循环来找,但是如果数据过大的话很容易就导致程序超时。
但实际上,我们可以发现找最大的质数就等价于找最小的质数,只要最后用n除以最小的质数就可以了

代码如下:

a = int(input())
b = 0

for i in range(2,a // 2 + 1):
    if a % i == 0:
        print(a // i)
        break

P1598

写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过 100 个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。

我们很容易从python的内置函数中获取到每个字母在字符串中的个数,但是这个问题的关键在于输出;有两种解决办法【本质上是一样的】:
1、直接输出
2、将数据存储到二维列表后输出

这里仅提供第一种代码:

string = ""
for i in range(0,4):
    string += input().lower()

result = []

for i in range(0,26):
    a = chr(i+ord("a"))
    index = 0
    temp = 0
    while True:
        x = string.find(a,index)
        if x != -1:
            temp += 1
            index = x + 1
        else:
            break
        
    result.append(temp)

t = max(result)
ind = 0
cishu = 0

while max(result) != 0:
    a = max(result)
    index = result.index(a)
    if a != t:
        for i in range(0,t - a):
            print("")
        for i in range(0,index):
            print(" ",end=" ")
    else:
        if cishu != 0:
            print(" ",end="")
        else:
            print("  ",end="")
        cishu = 1
        for i in range(0,index - ind - 1):
                print(" ",end=" ")

    print("*",end="")

    t = a
    result[index] -= 1
    ind = index

print("")
for i in range(0,25):
    print(chr(ord("A") + i) + " ", end = "")
print("Z",end="")

P1914

某蒟蒻迷上了 “小书童”,有一天登陆时忘记密码了(他没绑定邮箱 or 手机),于是便把问题抛给了神犇你。

这题我们可以通过将字母转为ASCII再转为字母来实现变化

ASCII

代码如下:

a = int(input())
s = input()
ss = ""

for i in range(0,len(s)):
    t = ord(s[i]) - ord("a")
    t += a
    t = t % 26
    ss = ss + chr(t + ord("a"))

print(ss)

P2141

珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

这一题的描述其实有一点问题,它还有一个限制条件,即在已经计算出来的和的里面也不能有相同的数,代码如下:

a = int(input())
b = input().split()
count = 0
c = []

for i in range(0,a):
    b[i] = int(b[i])

for i in range(0,len(b)):
    for k in range(i + 1,a):
        temp = b[i] + b[k]
        if temp in b:
            if temp not in c:
                count += 1
                c.append(temp)

print(count)

P1308

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2 )。

这个问题的主要难点在于怎么合理的检测字符(即怎么判断字符串是否是单独的)【注意:这里不能使用split方法,如果使用了我们就无法判断该单词首字母在原字符串中的索引】

w = input().lower()
s = input().lower()

count = 0
index = -1
t = 0

while True:
    i = s.find(w,t)
    if i != -1:
        qian = s[i - 1] if (i - 1) >= 0 else " "
        hou = s[i + len(w)] if (i + 1) <= len(s) - 1 else " "
        if qian == " " and hou == " ":
            count += 1
            if count == 1:
                index = i
        t = i + 1
    else:
        break

if count > 0:
    print(str(count) + " " + str(index))
else:
    print(-1)

注:如有更简单的代码欢迎在评论区留言哦!



logo   WRITTEN BY:Serence

一个程序员和文艺青年的博客!

本文章采用CC BY-NC-SA 4.0进行许可。转载请注明出处!

上一篇

诗与话 - 3


下一篇

洛谷入门题 - 2