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 输出总时间
相关推荐
上弦月-编程2 分钟前
【C语言】函数栈帧的创建与销毁(底层原理)
c语言·开发语言
MATLAB代码顾问3 分钟前
混合粒子群-模拟退火算法(HPSO-SA)求解作业车间调度问题——附MATLAB代码
算法·matlab·模拟退火算法
辞旧 lekkk6 分钟前
【Qt】初识(上)
开发语言·数据库·qt·学习·萌新
Felven7 分钟前
C. Prefix Min and Suffix Max
算法
加农炮手Jinx7 分钟前
LeetCode 26. Remove Duplicates from Sorted Array 题解
算法·leetcode·力扣
加农炮手Jinx8 分钟前
LeetCode 88. Merge Sorted Array 题解
算法·leetcode·力扣
Hhy_11078 分钟前
【从零开始学习数据结构 ④】:栈 ——后进先出的艺术
c语言·数据结构·学习·visual studio
格林威8 分钟前
线阵工业相机:如何计算线阵相机的行频(Line Rate)?公式+实例
开发语言·人工智能·数码相机·算法·计算机视觉·工业相机·线阵相机
2501_9271682910 分钟前
手机号测吉凶:尾数722手机号吉凶
笔记
yueyue54311 分钟前
透过现象看本质:以fast_lio架构的整套算法的局部避障改为TEB算法为例深度探讨——如何成为一个合格的算法架构师?
算法·架构