PTA刷题笔记3(微难,有详解)

·7-15 计算圆周率

代码如下:

复制代码
#include <stdio.h>

int main() {
    double threshold;
    scanf("%lf", &threshold);
    
    double pi_over_2 = 1.0;  // π/2的初始值(第一项1)
    double term = 1.0;       // 当前项的值
    int n = 1;               // 当前项的索引
    
    while (term >= threshold) {
        term = term * n / (2 * n + 1);  // 递推计算下一项
        pi_over_2 += term;
        n++;
    }
    
    double pi = 2 * pi_over_2;  // 计算π的近似值
    printf("%.6f\n", pi);       // 输出结果,保留6位小数
    
    return 0;
}

·7-16 求符合给定条件的整数集

分析题目

题目要求给定一个不超过6的正整数A,考虑从A开始的连续4个数字(即A, A+1, A+2, A+3),然后输出所有由这4个数字组成的无重复数字的3位数。

例如输入样例是2,那么4个数字是2,3,4,5,然后生成所有可能的3位数排列(排列数P(4,3)=4×3×2=24个)。

解决思路

  1. 获取输入的数字A

  2. 生成4个连续数字:A, A+1, A+2, A+3

  3. 生成所有可能的3位数排列(不能有重复数字)

  4. 将结果排序

  5. 按要求格式输出(每行6个,空格分隔,行末无空格)

代码如下:

复制代码
#include <stdio.h>

int main() 
{
    int A;
    scanf("%d", &A);
    
    int digits[4];
    for (int i = 0; i < 4; i++) 
    {
        digits[i] = A + i;
    }
    
    int count = 0;
    for (int i = 0; i < 4; i++) 
    {
        for (int j = 0; j < 4; j++) 
        {
            if (j == i) continue;
            for (int k = 0; k < 4; k++) 
            {
                if (k == i || k == j) continue;
                int num = digits[i] * 100 + digits[j] * 10 + digits[k];
                if (count % 6 == 0) 
                {
                    if (count != 0) printf("\n");
                    printf("%d", num);//每行的首个元素
                } 
                else 
                {
                    printf(" %d", num);//每行剩下的五个元素,注意前面有空格
                }
                count++;
            }
        }
    }
    
    return 0;
}

代码解释

  1. 首先读取输入的整数A

  2. 创建一个数组digits存储A开始的4个连续数字

  3. 使用三重循环生成所有排列:

· 第一层循环选择百位数

· 第二层循环选择十位数(不能与百位数相同)

· 第三层循环选择个位数(不能与百位或十位数相同)

  1. 在输出时控制格式,每6个数字一行,用空格分隔,行末无多余空格

  2. 使用count变量跟踪已输出的数字数量来控制换行

·7-17 爬动的蠕虫

代码如下:

复制代码
#include <stdio.h>

int main() {
    int N, U, D;
    scanf("%d %d %d", &N, &U, &D);
    
    int time = 0;
    int height = 0;
    
    while (1) {
        // 向上爬
        height += U;
        time++;
        if (height >= N) {
            break;
        }
        
        // 下滑
        height -= D;
        time++;
    }
    
    printf("%d\n", time);
    
    return 0;
}

代码说明

  1. 输入处理*:使用 scanf 读取三个整数N、U、D,分别代表井深、每分钟上爬距离和每分钟下滑距离。

  2. 初始化:

· time 变量记录总时间(分钟)

· height 变量记录蠕虫当前高度

  1. 主循环:

· 每次循环先让蠕虫向上爬U寸,时间增加1分钟

· 检查是否到达或超过井口(`height >= N`),如果是则跳出循环

· 如果没有到达井口,则下滑D寸,时间再增加1分钟

  1. 输出结果:使用 printf 输出总时间
相关推荐
Aurorar0rua13 分钟前
CS50 x 2024 Notes Arrays - 04
c语言·开发语言·学习方法
Asize13 分钟前
数组数据结构底层:从灵活到陷阱
前端·javascript·算法
旅僧20 分钟前
Π0 理论讲解更新中
学习
wuminyu29 分钟前
Java世界中StringTable源码剖析
java·linux·c语言·jvm·c++
hairenwangmiao38 分钟前
B4041 [GESP202409 四级] 区间排序
算法·排序
人道领域1 小时前
【LeetCode刷题日记】47.全排列Ⅱ
java·开发语言·算法·leetcode
漂流瓶jz1 小时前
UVA-1606 两亲性分子 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·向量·aoapc·算法竞赛入门经典·atan2·浮点
Navigator_Z1 小时前
LeetCode //C - 1095. Find in Mountain Array
c语言·算法·leetcode
知南x1 小时前
【DPDK例程学习】(3) timer
学习
智者知已应修善业1 小时前
【用74LS151的实现(16序列信号发生器)】2024-6-1
驱动开发·经验分享·笔记·硬件架构·硬件工程