PTA_浙大版《Python 程序设计》题目集第7章-1 词频统计分数 30

该博客讲述了如何编写程序来统计一段英文文本中的不同单词数量,并找出词频最高的前10%的单词。输入文本包含特殊字符,需先进行处理。代码实现了去除特殊字符,转换为小写,分割单词并统计词频。输出包括所有不同单词的数量以及高频词。示例输入和输出已给出,代码符合时间、内存和长度限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第7章-1 词频统计

分数 30

全屏浏览题目

切换布局

作者 DS课程组

单位 浙江大学

请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词。

所谓“单词”,是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留前15个单词字符。而合法的“单词字符”为大小写字母、数字和下划线,其它字符均认为是单词分隔符。

输入格式:

输入给出一段非空文本,最后以符号#结尾。输入保证存在至少10个不同的单词。

输出格式:

在第一行中输出文本中所有不同单词的个数。注意“单词”不区分英文大小写,例如“PAT”和“pat”被认为是同一个单词。

随后按照词频递减的顺序,按照词频:单词的格式输出词频最大的前10%的单词。若有并列,则按递增字典序输出。

输入样例:

This is a test.

The word "this" is the word with the highest frequency.

Longlonglonglongword should be cut off, so is considered as the same as longlonglonglonee.  But this_8 is different than this, and this, and this...#
this line should be ignored.

输出样例:(注意:虽然单词the也出现了4次,但因为我们只要输出前10%(即23个单词中的前2个)单词,而按照字母序,the排第3位,所以不输出。)

23
5:this
4:is

感谢武汉理工大学的郭小兵老师修正测试数据!

代码长度限制

16 KB

时间限制

2000 ms

内存限制

64 MB

感想:由于我当时学Python是买的北理工嵩天老师的书,没有买浙大版Python,没有读者验证码,无法在PTA系统中提交代码运行,所以只能自己在VScode 中跑了几个例子,代码可能有所欠缺,但基本思路都对了

参考代码:

def readInput():
    res=""
    word=input()
    while word.count('#')==0:
        res+=word
        word=input()
    res+=(word.split('#'))[0]
    return res

read=readInput()
# print("打印输入:",read)
specialChar='!"#$%&()*+,-./:;<=>?@[\\]^`{|}~'
for ch in specialChar:
    read=read.replace(ch,' ')
read=read.lower()
words=read.split(' ')
# for word in words:
#     print(word,end=" ")

counts={}   #字典counts
for word in words:
    counts[word]=counts.get(word,0)+1

items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
uniqueSum=len(items)
span=int(0.1*uniqueSum)
print(uniqueSum)
for i in range(span):
    word,count=items[i]
    print(str(count)+":"+word)

<think>好的,我现在需要解决用户关于浙大《C语言程序设计实验与习题指导(第4)》中实验6-1近似求PI的解法的问题。首先,我要回忆一下这个题目的具体要求。实验6-1通常涉及使用某种数学方法来近似计算π的值,常见的方法可能有莱布尼茨级数、蒙特卡洛方法或者泰勒展开等。不过用户提到的是近似求PI,可能使用的是级数展开的方式。 接下来,我需要确认题目的具体内容。假设题目要求根据给定的公式来计算π的近似值,直到最后一项小于给定的阈值ε为止。例如,莱布尼茨公式是:π/4 = 1 - 1/3 + 1/5 - 1/7 + ...,但可能有不同的变种。因此,我需要先明确题目中的公式是什么样子的。 假设题目中的公式是类似这样的展开式:π/2 = 1 + 1/3 + (1*2)/(3*5) + (1*2*3)/(3*5*7) + ...,这可能是某个特定的级数展开式。或者可能是其他形式的级数。这时候,我需要用户提供更多的信息,但根据常见的实验题,可能采用的是这样的递推公式。 然后,我需要考虑如何用C语言实现这个级数的计算。通常需要用到循环结构,每次迭代计算下一项,直到最后一项小于给定的ε。需要注意的问题包括分子和分母的递推关系、符号的变化(如果有的话)、以及如何累加各项的和。 例如,假设每一项的分子是前一项的分子乘以一个递增的数,而分母则是前一项的分母乘以另一个递增的数。比如,分子从1开始,每次乘以k,而分母从3开始,每次乘以(2k+1)。这时候,每一项的形式就是term = term * k / (2k+1),其中k从1开始递增,直到term < ε。 然后,将所有的term累加起来,总和乘以2得到π的近似值,因为这样的级数可能收敛到π/2。因此,最终结果需要乘以2。 在代码实现中,需要注意以下几点: 1. 初始化变量:sum初始化为第一项(比如1),term初始化为1,或者根据具体级数的起始项调整。 2. 循环条件:当最后一项的绝对值不小于ε时继续循环。 3. 在每次循环中更新term的值,并累加到sum中。 4. 最后根据级数的关系乘以相应的系数得到π的近似值。 例如,可能的代码结构如下: ```c #include <stdio.h> int main() { double epsilon; scanf("%lf", &epsilon); double sum = 1.0; // 初始项 double term = 1.0; int k = 1; while (term >= epsilon) { term = term * k / (2*k + 1); sum += term; k++; } double pi = 2 * sum; printf("%.6f\n", pi); return 0; } ``` 这里需要注意,循环的条件可能要根据term的绝对值是否大于等于ε来决定是否继续。如果级数中有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值