PTA每日一题

1.基于泰勒级数展开求余弦函数值

def factorial(n):
    fact = 1
    for i in range(1, n + 1):
        fact *= i
    return fact

def cos_expend(x):
    i = 0
    c = 1
    a = ((-1) ** i) * (x ** (2 * i)) / factorial(2 * i)
    b = a
    while abs(a) >= 1e-5:
        i += 1
        c += 1
        a = ((-1) ** i) * (x ** (2 * i)) / factorial(2 * i)
        b += a
    return b, c

if __name__ == '__main__':
    x = float(input())
    a, c = cos_expend(x)
    print('cos(x)={:.6f}'.format(a))
    print('count={}'.format(c))

错误分析:

1.在定义cos_expend()时把i和c当成一个东西了,i是a定义里的,而c是计算迭代次数。

*2.每次循环更新b,然后赋值给a

def cos_expend(x):
    i = 0
    c = 1
    a = ((-1) ** i) * (x ** (2 * i)) / factorial(2 * i)

    while abs(a) >= 1e-5:
        i += 1
        c += 1
        b = a + ((-1) ** i) * (x ** (2 * i)) / factorial(2 * i)
        a = b
    return a, c

结果报错:OverflowError: int too large to convert to float,改阶乘定义里的初始值1为1.0没用

更改更新方式,直接更新a,累加到b后才运行正确

2.计算1∗2∗3+3∗4∗5+...+99∗100∗101

a,b,c=1,2,3
d = 6
while a < 99:
    a += 2
    b += 2
    c += 2
    d += a*b*c
print('sum={}'.format(d))

*3.查找夫妻数

def get_divisors_sum(num):
    # 计算一个数的所有因数之和
    divisors_sum = 0
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            divisors_sum += i
            if i != num // i:
                divisors_sum += num // i
    return divisors_sum

def find_couple_numbers(m, n):
    count = 0
    couples = set()  # 使用set去重存储夫妻数对
    for x in range(m, n + 1):
        y = get_divisors_sum(x)
        if x != y and get_divisors_sum(y) == x and (y, x) not in couples:
            couples.add((x, y))
            count += 1
    if count == 0:
        print("没有找到")
    else:
        for couple in couples:
            print(couple)
        print(f"共找到{count}对夫妻数")

# 输入两个正整数m和n
m, n = map(int, input().split())

find_couple_numbers(m, n)

4.埃拉托色尼筛法

def find_kth_removed_number(n, k):
    primes = []  # 存储素数
    is_prime = [True] * (n+1)  # 初始认为所有数都是素数

    for i in range(2, n+1):
        if is_prime[i]:
            primes.append(i)
            for j in range(i*i, n+1, i):  # 划掉所有i的倍数
                is_prime[j] = False

    removed = []  # 存储被删除的整数
    for i in range(len(primes)):
        p = primes[i]
        for j in range(p, n+1, p):  # 划掉p的所有倍数
            if j not in removed:
                removed.append(j)
                if len(removed) == k:
                    return j

if __name__ == '__main__':
    n, k = map(int, input().split())
    result = find_kth_removed_number(n, k)
    print(result)

错误分析:

def ailatuose(n,k):
    a = []
    nums = [i for i in range(2,n+1)]
    for i in nums:
        for j in range(2,n):
            # 找到素数
            if i % j != 0 or i == 2:
                a.append(i)
                nums.remove(i)
                # 素数的倍数
                for g in range(2, n // 2 + 1):
                    multiple = i * g
                    if multiple in nums:
                        a.append(multiple)
                        nums.remove(multiple)
                        # 第k个被划掉的整数
                        if len(a) == k:
                            return a[-1]
if __name__ == '__main__':
    n, k = map(int, input().split())
    print(ailatuose(n,k))

原先筛选素数的倍数我用素数依次乘以(2,n/2 + 1),看在不在(2,n)里面,改进后,用range(start, stop, step)从起始数字一直加素数。

用remove会导致

ValueError: list.remove(x): x not in list

5.计算a+aa+aaa+...+aa...a(n个a)的值

a, n = map(int, input().split())

# 计算累加和
sum = 0
for i in range(1, n+1):
    term = int(str(a) * i)
    sum += term

# 输出结果
print("sum={}".format(sum))

巧用字符串和整型的转换

*6.sdut-C语言实验-汉诺塔

n = int(input())

def hannuota(n):
    if n == 1:
        print("Move disk 1 from A to C")
    else:
        count = 1
        while n > 1:
            print("Move disk {} from A to B".format(count))
            count += 1
            n -= 1
        print("Move disk {} from A to C".format(count))
        for i in range(count-1,0,-1):
            print("Move disk {} from B to C".format(i))

hannuota(n)

第一个问题就是它莫名报错我多了一个空行

这一点只要在结尾添加end=""就可以解决该报错,在这题把这句代码添加在print("Move disk {} from B to C".format(i))即可。

*7.请用正则表达式实现,多行字符串处理

def find_duplicate_words(lines):
    duplicates = []

    for i, line in enumerate(lines):
        words = line.strip().split()
        seen = set()
        
        for word in words:
            if word in seen:  # 如果单词已经出现过一次,则添加到重复列表中
                duplicates.append((word, line))
            else:
                seen.add(word)  # 将单词添加到已经出现过的集合中

    return duplicates


n = int(input())
lines = []
for _ in range(n):
    lines.append(input())

duplicates = find_duplicate_words(lines)

for i, duplicate in enumerate(duplicates):
    if i != len(duplicates) - 1:
        print(f"{duplicate[0]},{duplicate[1]}")
    else:
        print(f"{duplicate[0]},{duplicate[1]}",end="")

8.幂级数的和函数验证

import math

# 输入x和n
x, n = map(float, input().split())
n = int(n)

# 计算幂级数的前n项和
sum_of_series = 0
for i in range(1, n+1):
    sum_of_series += (((-1)**(i-1))/(i*(2*i-1)))*x**(2*i)

# 计算和函数在x处的值
value_of_function = 2*x*math.atan(x)-math.log(1+x**2)

# 输出结果
print("{:.10f}".format(sum_of_series))
print("{:.10f}".format(value_of_function),end="")

这里要注意一下传入的参数一个是浮点数,一个是整数,运算的时候要确保数据类型一致,小心TypeError: 'float' object cannot be interpreted as an integer这个报错^_^

<think>好的,我现在需要帮用户制定一份适合初学者的C语言学习方案。首先,我得考虑用户的需求,他们可能完全没有编程经验,所以得从基础开始,循序渐进。 第一步应该是环境搭建,因为学习编程首先要能动手写代码。我需要推荐安装编译器,比如GCC或者Visual Studio,这样用户可以直接开始实践。然后,可能需要指导他们如何编写第一个Hello World程序,这是传统的第一步,能让他们有成就感。 接下来是基础语法部分。变量和数据类型是核心,得解释清楚int、float、char这些基本类型,以及如何声明和使用变量。然后是运算符和表达式,包括算术运算和逻辑运算,这些都是写程序的基础。输入输出函数,比如printf和scanf,必须详细讲解,因为这是与程序交互的基础。 控制结构是接下来的重点。顺序结构、条件语句(if-else)、循环结构(for、while、do-while),这些都需要通过例子来巩固。比如,用if-else判断闰年,用循环计算阶乘,这样用户能理解实际应用。 数组和字符串处理也是必须的。一维数组、二维数组,以及字符串的函数,比如strlen、strcpy,这些内容需要结合练习,比如冒泡排序,让用户掌握数据处理的基本方法。 函数部分要强调模块化编程的重要性,讲解参数传递和返回值,递归可能对新手有点挑战,但通过阶乘的例子可以直观展示。指针是C语言的难点,需要详细解释指针的概念、运算,以及和数组的关系,避免混淆。内存管理如malloc和free的使用,必须强调防止内存泄漏。 结构体和文件操作是进阶内容,结构体可以帮助组织复杂数据,文件操作则是持久化数据的关键。需要设计综合案例,比如学生管理系统,把之前的知识点整合起来。 最后,学习资源推荐很重要,书籍如《C Primer Plus》和在线平台如LeetCode能提供更多练习。注意事项部分要提醒多实践、调试技巧和代码规范,养成良好的编程习惯。 整个方案需要结构清晰,逐步推进,每个阶段都有明确的目标和练习,确保用户能循序渐进地掌握C语言的核心概念,同时通过实际项目巩固知识。需要检查是否有遗漏的部分,比如指针和内存管理是否足够详细,以及练习案例是否恰当。确保语言通俗易懂,避免使用过于专业的术语,让初学者容易理解。</think>我为您整理了一份分阶段、循序渐进的C语言学习方案(共6个阶段),附带具体学习内容和练习建议: 一、环境搭建(1天) 1. 安装编译器 - Windows推荐:Code::Blocks/MinGW 或 Visual Studio Community - Mac推荐:Xcode - Linux:使用`sudo apt-get install build-essential`安装GCC 2. 编写第一个程序 ```c #include <stdio.h> int main() { printf("Hello, World!\n"); return 0; } ``` 二、基础语法(2-3周) 1. 变量与数据类型 - 基本类型:int, float, double, char - 类型转换:自动转换与强制转换 2. 运算符与表达式 - 算术运算符:$a = (b + c) * d / e % 5$ - 关系运算符:==, !=, >, < 3. 输入输出 ```c int age; printf("请输入年龄:"); scanf("%d", &age); ``` 三、控制结构(2周) 1. 条件语句 ```c if(score >= 90) { printf("A"); } else if(score >= 60) { printf("及格"); } else { printf("不及格"); } ``` 2. 循环结构 - 计算阶乘: ```c int n = 5, fact = 1; for(int i=1; i<=n; i++){ fact *= i; } ``` 四、数组与字符串(2周) 1. 一维数组操作 ```c int arr[5] = {1,2,3,4,5}; for(int i=0; i<5; i++){ printf("%d ", arr[i]); } ``` 2. 字符串处理 ```c char str[20] = "Hello"; strcat(str, " C!"); printf("%s", str); // 输出:Hello C! ``` 五、函数与指针(3-4周) 1. 函数定义 ```c int add(int a, int b) { return a + b; } ``` 2. 指针基础 ```c int var = 20; int *ptr = &var; printf("%d", *ptr); // 输出20 ``` 3. 动态内存分配 ```c int *arr = (int*)malloc(5 * sizeof(int)); free(arr); ``` 六、进阶内容(2-3周) 1. 结构体 ```c struct Student { char name[20]; int age; float score; }; ``` 2. 文件操作 ```c FILE *fp = fopen("data.txt", "w"); fprintf(fp, "数据写入测试"); fclose(fp); ``` 📝 配套练习建议: 1. 每日代码量:至少50行有效代码 2. 阶段小项目: - 计算器程序(控制台版) - 学生成绩管理系统 - 文本文件加密工具 📚 学习资源推荐: 1. 书籍:《C Primer Plus》《C语言程序设计(谭浩强)》 2. 在线练习:LeetCode初级题库、PTA程序设计实验辅助教学平台 3. 开发工具:Visual Studio Code + C/C++扩展 ⚠️ 注意事项: 1. 重视调试能力培养,学会使用gdb或IDE调试器 2. 养成写注释的习惯,例如: ```c /* 计算圆面积 @param r 半径 @return 圆面积 */ float circleArea(float r) { return 3.14159 * r * r; } ``` 3. 注意指针和内存管理的安全性 建议每天保持2小时的有效学习时间,理论学习和实践操作按1:2比例分配。完成此方案后,可继续学习数据结构与算法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值