C语言-翁恺-PTA-01-40课后练习题-01.md


title: C语言-翁恺-PTA-01-40课后练习题-01
tags:

  • PTA
  • C
  • 中M24春C&Java入门
    description: ’ ’
    mathjax: true
    date: 2024-03-30 11:42:28
    categories:
  • PTA
  • C

也是真的想吐槽,这个B练习题,网上一搜代码都是一样的,我是垃圾,不会写,所以上网抄别人的思路,不是,你们这些会写的,怎么思路都一摸一样啊。

PTA真的拉跨,试卷也是拉跨。吐槽完了,记录一下别人的思路,毕竟我是最菜的

7-20 简单计算器(20 分)

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:
1+2*10-10/2=
输出样例:
10

他人代码如下:

#include <stdio.h>
int main()
{
    int n1, n2;
    char ch;
    scanf("%d", &n1); // 不管怎样先输入一个数
    while(1)
    {
        scanf("%c", &ch);
        if(ch=='='){ 
        // 如果输入的操作符为等号则直接输出而不必进行后续操作了
            printf("%d\n", n1);
            break;
        }
        else{
        // 否则继续输入第二个操作数
            scanf("%d", &n2);
        }
        if(ch=='+')
            n1 += n2;
        else if(ch=='-')
            n1 -= n2;
        else if(ch=='*')
            n1 *= n2;
        else if(ch=='/')
        {
            if(n2==0)
            {
                printf("ERROR\n");
                break;
            }
            else
            {
                n1 /= n2;
            }
        }
        else
        {
            printf("ERROR\n");
            break;
        }
    }

    return 0;
}


7-27 兔子繁衍问题

7-27 兔子繁衍问题

分数 15

作者 徐镜春

单位 浙江大学

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:

输入在一行中给出一个不超过10000的正整数N

输出格式:

在一行中输出兔子总数达到N最少需要的月数。

输入样例:
30
输出样例:
9

代码长度限制

16 KB

时间限制

400 ms

内存限制

这个题目我也不会做,我也是有点抽象的,这个本质是一个斐波那契数列

但是我没有发现,我也是一个纯纯的笨蛋了

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void) {
    int a = 0, b = 1, temp, N, month = 1;//b 代表累加的和(总兔子的只数),初始值为1
    scanf("%d", &N);

    while (b < N) {
        month++;
        temp = a;//a 表示新生的兔子对数
        a = b;
        b = b + temp;
    }
    printf("%d\n", month);

    return 0;
}

7-29 二分法求多项式单根

这题的一开始写的代码,运行超时了

这个是我写的代码,但是问题比较大,于是,学习一下,别人的代码

错误代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
float funct(int a3,int a2 ,int a1 ,int a,float num) {
    return a3 * num * num * num + a2 * num * num + a1 * num + a;
}
int main(void) {
    int a3 = 0, a2 = 0, a1 = 0, a = 0;
    float left = 0, right = 0,mid=0;
    scanf("%d %d %d %d", &a3, &a2, &a1, &a);
    scanf("%f %f", &left, &right);
    while (1) {
        mid = (left + right) / 2;
        if (funct(a3, a2, a1, a, mid) == 0) {
            printf("%0.2f", mid);
            break;
        }
        else if (funct(a3, a2, a1, a, left) * funct(a3, a2, a1, a, mid) > 0) {
            left = mid;
        }
        else  right = mid;
    }
    return 0;
}

错误的点:

这题,我确实是哈皮,这题也只能找一些无限接近于0的点,所以是要人为设置极限的,但是我没有明白,所以就错的蛮多的

改后的代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//double a3 = 0, a2 = 0, a1 = 0, a = 0;
double funct(double a3, double a2, double a1, double a, double x) {
    return a3 * x * x * x + a2 * x * x + a1 * x + a;
}
int main(void) {
    double left = 0, right = 0, mid = 0;
    double a3 = 0, a2 = 0, a1 = 0, a = 0;
    scanf("%lf %lf %lf %lf %lf %lf", &a3, &a2, &a1, &a, &left, &right);
    while (right - left >= 0.001 && funct(a3,a2,a1,a,left) * funct(a3,a2,a1,a,right) <= 0) {
        //right-left>=0.001,就是我们人为设置的极限
        if (funct(a3,a2,a1,a,left) == 0) {
            mid = left;
            break;
        }
        if (funct(a3,a2,a1,a,right) == 0) {
            mid = right;
            break;
        }
        mid = (left + right) / 2.0;
        //if (funct(a3,a2,a1,a,a3, a2, a1, a, mid) == 0) {
        //    printf("%0.2f", mid);
        //    return 0;
        //}
        if (funct(a3,a2,a1,a,left) * funct(a3,a2,a1,a,mid) > 0) {
            left = mid;
        }
        else  right = mid;
    }
    printf("%.2lf", mid);
    return 0;
}

别人的代码好在哪里:

别人的代码,使用了一个全局变量,考虑到了这个人为设置极限的点:

#include<stdio.h>
double a3,a2,a1,a0;//跨函数的变量弄成全局变量

double f(double x){
    return a3*x*x*x+a2*x*x+a1*x+a0;
}

int main(){
    double a,b,mid;
    scanf("%lf %lf %lf %lf",&a3,&a2,&a1,&a0);
    scanf("%lf %lf",&a,&b);
    while(b-a>=1e-4 && f(a)*f(b)<=0){//1e-4是10的(-4)次方,小于这个数是因为想到
        if(f(a)==0){//某个时间结束,而不是无限进行下去,不加会TLE
            mid=a;//mid代表是根
            break;
        }
        if(f(b)==0){
            mid=b;
            break;
        }
        mid=(a+b)/2;
        if(f(mid)==0){
            break;
        }else{
            if(f(mid)*f(a)>=0){
                a=mid;
            }else{
                b=mid;
            }
        } 
    }
    printf("%.2f",mid);
    return 0;
}

7-36 韩信点兵

在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:

  • 按从1至5报数,记下最末一个士兵报的数为1;
  • 再按从1至6报数,记下最末一个士兵报的数为5;
  • 再按从1至7报数,记下最末一个士兵报的数为4;
  • 最后按从1至11报数,最末一个士兵报的数为10;

请编写程序计算韩信至少有多少兵。

输入格式:

本题无输入

输出格式:

输出韩信至少拥有的士兵人数。

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

这题是简单的,但是我的直觉告诉我,应该有更好的代码,这是我的暴力算法

我的代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void) {
    for (int i = 0; i < 5*6*7*11; i++) {
        if (i % 5 == 1 && i % 6 == 5 && i % 7 == 4 && i % 11 == 10) {
            printf("%d", i);
        }
    }
    return 0;
}

不过我简单的找了一下,不是LeetCode上,别人的好代码,没有显示出来

找到的,都是和我差不多的垃圾代码

7-38 支票面额

这题就是我不会的题目了,也是非常的讨厌的,这题就不会了,我也是一个纯纯的笨蛋

一个采购员去银行兑换一张yf分的支票,结果出纳员错给了fy分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?

输入格式:

输入在一行中给出小于100的正整数n

输出格式:

在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution

输入样例1:

23

输出样例1:

25.51

输入样例2:

22

输出样例2:

No Solution

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

错误原因:

这题我确实是应该错的,这题我没有一点点的思路,是真的一点点都没有,换算也不清楚,所以查看其它人的代码。

我真的是痴呆了,元和分的换算公式也能弄错,还有就是我考虑到了,兑换之前的和兑换之后的是两倍,但是我还是没有写出公式

大喊30遍,我是哈皮,题目看错了,我以为的是

采购员去银行兑换,出纳员给错了,然后出纳员用去了n元,余额也是出纳员的,这我怎么可能做的出来,这样有不等式的关系,其实就是可以做的,是我蠢猪了

然后就是这个是有公式的

100 ∗ f + y − n = 200 ∗ y + 2 ∗ f → 100*f+y-n=200*y+2*f \rightarrow 100f+yn=200y+2f

98 ∗ f − 199 ∗ y = n 98*f-199*y=n 98f199y=n

又因为f是分,所以
0 < f < 100 0<f<100 0<f<100

98 ∗ f − 199 ∗ y = n 98*f-199*y=n 98f199y=n

0 < n < 100 0<n<100 0<n<100

上面两个式子一结合等于
y < 98 ∗ f 199 y<\frac{98*f}{199} y<19998f
f的最大值,是100(无法取到),一算就是
0 < = y < 49 0<=y<49 0<=y<49

综上所述,代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void) {
    int y = 0, f = 0, n = 0,flag=0;
    scanf("%d", &n);
    for (int y = 0; y < 49; y++) {
        for (int f = 0; f < 100; f++) {
            if (98 * f - 199 * y == n) {
                flag = 1;
                printf("%d.%d", y, f);
            }
        }
    }
    if (!flag)   printf("No Solution");
    return 0;
}

7-39 龟兔赛跑

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:

输入在一行中给出比赛时间T(分钟)。

输出格式:

在一行中输出比赛的结果:乌龟赢输出@_@,兔子赢输出^_^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。

输入样例:

242

输出样例:

@_@ 726

代码长度限制

16 KB

时间限制

400 ms

内存限制

错误原因,

这题我确实是一点思路都没有,这题,数学的问题,就感觉很头疼

这题的代码和思路,主要是Copy这个大佬的,地址如下,代码也如下:

https://www.cnblogs.com/haimeng-lin/p/15427074.html

本题乌龟的路程很简单,计算兔子的路程关键就在怎么区分兔子跑步的时间。引入两个参数,run参数显示兔子状态,为1则在跑步,为0则在睡觉;参数sleeptime显示开始睡觉的时间。

当run = 1时,兔子路程计入;满足三个条件时开始睡觉:①时间为十的倍数;②兔子目前在跑步,也就是run = 1;③兔子路程大于乌龟路程。满足条件开始睡觉,记录睡觉时间,到时间后run改为1自动苏醒。

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void) {
    int turtle = 0, rabbit = 0, t = 0, run = 0, sleeptime = 0;
    //run代表兔子是否睡觉,兔子一开始不是睡觉的.sleeptime的意思是,一开始睡觉的时候
    scanf("%d", &t);
    for (int i = 1; i <= t; ++i)
    {
        turtle += 3;        //乌龟一定是在跑步的
        if (run == 0)       //兔子不睡觉是0
            rabbit += 9;
        if ((i % 10 == 0) && (rabbit > turtle) && (run == 0))   
            //如果兔子还在跑的状态,而且已经比乌龟快,正好在检查点上
        {
            run = 1;    //改变兔子的状态
            sleeptime = i;  //睡觉的时间,就等于i,目前的时间
        }
        if (i == sleeptime + 30)    //如果已经过了30分钟的话
        {
            run = 0;                //设置兔子醒过来继续跑
        }
    }
    if (rabbit > turtle)   printf("^_^ %d", rabbit);
    else if (rabbit == turtle) printf("-_- %d", rabbit);
    else printf("@_@ %d", turtle);
    return 0;
}
### 回答1: 翁恺ct-dist的文件夹是指翁恺在编程项目常用的文件夹之一。CT-Dist是一个常用的开源项目,用于计算文本之间的相似性。在这个项目翁恺通常会使用ct-dist文件夹来存放与CT-Dist相关的代码、配置文件和数据文件。 在ct-dist文件夹,可能会包含以下内容: 1. 源代码文件:这些文件包含了CT-Dist项目的核心代码,用于实现文本相似性计算的算法和功能。这些代码文件通常以.py或.java等编程语言的扩展名为后缀。 2. 配置文件:这些文件用于设置CT-Dist项目的参数和选项,以便根据具体需求对文本相似性计算进行定制。配置文件的内容可以包括输入输出路径、特征提取方法、权重设置等。 3. 数据文件:CT-Dist项目在计算文本相似性时需要使用的数据文件,如语料库、词向量文件等。这些数据文件可以通过配置文件的路径进行指定,并被代码读取和处理。 除此之外,ct-dist文件夹还可能包含测试文件、文档文件和结果输出文件等。测试文件用于验证CT-Dist项目的正确性和稳定性,文档文件则包含了关于CT-Dist项目的详细说明和使用指南。结果输出文件则保存了CT-Dist计算得到的文本相似性结果。 总之,翁恺ct-dist的文件夹是存放与CT-Dist项目相关的代码、配置文件和数据文件的文件夹。它是翁恺在编程项目的一个重要组成部分,用于实现文本相似性计算的功能。 ### 回答2: 翁恺ct-dist是一个文件夹,它可能是一个软件项目的一部分。ct-dist是一个常用的命名约定,通常表示"可执行项目的构建产物",也可以解释为"编译和分发的文件夹"。在这个文件夹,通常包含了经过编译和处理过的项目文件,以便进行部署和分发。 在ct-dist文件夹,我们通常可以看到一些特定的文件和文件夹。其包括编译后的可执行文件,如二进制文件或可执行脚本,这些文件通常表示程序的最终产物。还可能包含一些配置文件,用于指定程序的运行环境和参数设置。此外,ct-dist文件夹还可能包含一些资源文件,如图片、样式文件或其他必要的外部文件,这些文件在程序运行过程可能需要被引用。 翁恺ct-dist文件夹的存在对于项目的部署和分发非常重要。通过将编译后的可执行文件和其他必要的文件放在同一个文件夹,开发人员可以方便地进行项目的打包和分发。这样,其他用户或部署人员只需要将整个ct-dist文件夹复制到他们的机器上,即可执行项目,而不需要再去处理源代码或其他依赖项。 总之,翁恺ct-dist文件夹是一个存放编译、处理后的项目文件的文件夹,它对于项目的部署和分发起着重要作用。通过将项目的最终产物和必要的资源文件集在一个文件夹,简化了项目的部署过程,使其他用户可以更轻松地使用和执行这个项目。 ### 回答3: 翁恺ct-dist文件夹是一个用于存放由翁恺所开发的CT(Computer Tomography,计算机断层扫描)图像处理程序的文件夹。CT-dist是翁恺开发的一个用于计算机断层扫描图像分析和处理的软件包。 CT(Computer Tomography)是一种医学成像技术,通过利用X射线在人体内进行多个角度的扫描,然后将这些扫描数据进行重建,得到人体不同层面的断层图像。CT图像具有丰富的信息,可以帮助医生进行疾病诊断和治疗方案制定。但是,由于CT图像数据量大、复杂、难以直接观察和分析,因此需要借助计算机进行图像处理和分析。 翁恺ct-dist文件夹存放的程序主要用于CT图像分析和处理。这些程序包括了一系列的算法和方法,可以实现CT图像的预处理、降噪、增强、分割和三维重建等功能。通过这些程序,医生和研究人员可以提取出感兴趣的区域,进行病变检测和定量分析,从而辅助医学诊断和研究。 翁恺ct-dist文件夹的程序主要基于计算机视觉和数字图像处理的理论和方法。翁恺是计算机视觉和医学图像处理领域的专家,他的研究成果在CT图像分析和处理方面具有重要的应用价值。因此,翁恺ct-dist文件夹的程序不仅可以促进医学图像处理的研究和发展,同时也对于提高CT图像的质量和临床应用具有重要的意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值