2022 CSP-J 阅读程序3

news/2024/9/19 15:34:14/文章来源:https://www.cnblogs.com/suishou/p/18410035

1 2022 CSP-J 阅读程序3

阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填×;除特 殊说明外,判断题 1.5 分,选择题 3 分)

源代码

#include<iostream>using namespace std;int n,k;int solve1()
{int l=0,r=n;while(l<=r){int mid=(l+r)/2;if(mid * mid <=n) l=mid+1;else r=mid-1;}return l-1;
}double solve2(double  x)
{if(x == 0) return x;for(int i=0;i<k;i++)x=(x+n/x)/2;return x;
}int main()
{cin>>n>>k;double ans=solve2(solve1());cout<<ans<<' '<<(ans * ans == n)<<endl;return 0;
}

假设int为32位有符号整数类型,输入的n是不超过47000的自然数、k是不超过int表示范围的自然数,完成下面的判断题和单选题

判断题

28.该算法最准确的时间复杂度分析结果为O(logn+k) ( )

29.当输入为"9801 1"时,输出的第一个数为"99" 。( )

30.对于任意输入的n,随着所输入k的增大,输出的第2个数会变成"1" 。( )

31.该程序有存在缺陷。当输入的n过大时,第12行的乘法有可能溢出,因此应当将mid强制转换为64位整数再计算。( )

单选题

32.当输入为 “2 1” 时,输出的第一个数最接近( )

A. 1

B. 1.414

C. 1.5

D. 2

33.当输入"3 10"时,输出的第一个数最接近( )

A. 1.7

B. 1.732

C. 1.75

D. 2

34.当输入为"256 11"时,输出的第一个数( )

A. 等于16

B. 接近但小于16

C. 接近但大于16

D. 前三种情况都有可能

2 相关知识点

1) 算法时间复杂度

算法时间复杂度定性描述该算法的运行时间,常用大O符号表述

常用时间复杂度举例

2) 二分答案

二分答案顾名思义,它用二分的方法枚举答案,并且枚举时判断这个答案是否可行

直接对答案进行枚举查找,接着判断答案是否合法。如果合法,就将答案二分进一步靠近,如果不合法,就接着二分缩小判断。这样就可以大大的减少时间。

二分中有时可以得可行得答案,但不是最大的,继续向右靠近,求出最大值

示例

 int ans = 1;int l = 1,r = 100000;//在1~100000之间的整数枚举 while(l <= r){int m = l + (r - l) / 2;if(check(m)){//满足 则进行向右缩小范围 看看有没有更大的 ans = m;//可能多次赋值 最后一定是可能的最大值 l = m + 1;}else{//不满足缩小边长 向左缩小范围 用更小边长继续尝试 r = m - 1;} }

二分查找时间复杂度分析

二分查找每次都缩小或扩大为原来的一半和上面示例4类似,所以也是Olog(n)

3 思路分析

solve1函数

int solve1()
{int l=0,r=n;while(l<=r){int mid=(l+r)/2;if(mid * mid <=n) l=mid+1;else r=mid-1;}return l-1;
}

solve1函数是一个标准的二分答案算法,找到1个数x ,使得x * x 无限接近于n

也就是求n的平方根,当n=4时进行验证

n=4  l=0 r=4
//0<=4 进入循环
//第1次循环
mid=(l+r)/2=(0+4)/2=2 ,mid * mid =2 * 2=4<=4 条件满足 l=mid+1=2+1=3 r=4
//3<=4 条件满足
//第2次循环
mid=(l+r)/2=(3+4)/2=3, mid * mid =3 * 3 =9<=4 不满足,r=mid-1=3-1=2 l=3
//3<=2 条件不满足 退出循环
//返回 l-1 = 3 -1 =2
//所以当n=4时,函数solve1返回2,是4得平方根

如果n=5,是否也可以算出其平方根呢?

n=5  l=0 r=5
//0<=5 进入循环
//第1次循环
mid=(l+r)/2=(0+5)/2=2 ,mid * mid =2 * 2=4<=5 条件满足 l=mid+1=2+1=3 r=5
//3<=5 条件满足
//第2次循环
mid=(l+r)/2=(3+5)/2=4, mid * mid =4 * 4 =16<=5 不满足,r=mid-1=4-1=3 l=3
//3<=3 条件满足
//第3次循环
mid=(l+r)/2=(3+3)/2=3, mid * mid =3 * 3 =9<=5 不满足,r=mid-1=3-1=2 l=3
//3<=2 条件不满足 退出循环
//返回 l-1 = 3 -1 =2
//所以当n=5时,函数solve1返回2,不是5得平方根,2是小于5平方根得最大整数

根据如下代码,可以大概猜测solve2是辅助求出平方根是小数的情况,如果猜不出,可以模拟对应数据

double ans=solve2(solve1());
cout<<ans<<' '<<(ans * ans == n)<<endl;

假设int为32位有符号整数类型,输入的n是不超过47000的自然数、k是不超过int表示范围的自然数,完成下面的判断题和单选题

判断题

28.该算法最准确的时间复杂度分析结果为O(logn+k) ( T )

分析

此题调用了2次函数,solve1和solve2,其中solve1是二分答案,时间复杂度为O(logn),solve2的时间复杂度为O(k)

所以准确的时间复杂度为2者之和O(logn+k)

29.当输入为"9801 1"时,输出的第一个数为"99" 。( T )

分析

n=9801 ,求其对应平方根是99

k为1,执行1次 x = (x + n / x) / 2;

x=(99 + 9801/99)/2=99

所以是99

30.对于任意输入的n,随着所输入k的增大,输出的第2个数会变成"1" 。( F )

分析

如果平方根不是整数,求出结果没有精确的值,只能计算n的近似值,所以不会相等,返回false为0

31.该程序有存在缺陷。当输入的n过大时,第12行的乘法有可能溢出,因此应当将mid强制转换为64位整数再计算。( F )

分析

n最大是47000,中间可能导致溢出的是mid * mid,最大是(47000/2)*(47000/2)不会超过int的表示范围21亿

单选题

32.当输入为 “2 1” 时,输出的第一个数最接近( C )

A. 1

B. 1.414

C. 1.5

D. 2

分析

当n=2时,solve1求出平方根整数为1

//模拟过程
n=2  l=0 r=2
//0<=2 进入循环
//第1次循环
mid=(l+r)/2=(0+2)/2=1 ,mid * mid =1 * 1=1<=2 条件满足 l=mid+1=1+1=2 r=2
//2<=2 条件满足
//第2次循环
mid=(l+r)/2=(2+2)/2=2, mid * mid =2 * 2 =4<=2 不满足,r=mid-1=2-1=1 l=2
//2<=1 条件不满足 退出循环
//返回 l-1 = 2 -1 =1

k为1,执行1次 x = (x + n / x) / 2;

x=(1+2/1)/2=1.5

所以选C

33.当输入"3 10"时,输出的第一个数最接近( B )

A. 1.7

B. 1.732

C. 1.75

D. 2

分析

当n=3时,solve1求出平方根整数为1

//模拟过程
n=3  l=0 r=3
//0<=3 进入循环
//第1次循环
mid=(l+r)/2=(0+3)/2=1 ,mid * mid =1 * 1=1<=3 条件满足 l=mid+1=1+1=2 r=3
//2<=3 条件满足
//第2次循环
mid=(l+r)/2=(2+3)/2=2, mid * mid =2 * 2 =4<=3 不满足,r=mid-1=2-1=1 l=2
//2<=1 条件不满足 退出循环
//返回 l-1 = 2 -1 =1

k为10,执行10次 x = (x + n / x) / 2;

第1次 x=(1+3/1)/2=2
第2次 x=(2+3/2)/2=1.75
第3次 x=(1.75+3/1.75)/2=1.732
第4次 x=(1.732+3/1.732)/2=1.732
3/1.732 =1.732 所以后续计算约等于1.732

所以选B

34.当输入为"256 11"时,输出的第一个数( A )

A. 等于16

B. 接近但小于16

C. 接近但大于16

D. 前三种情况都有可能

分析

当n=256时,solve1求出平方根整数为16

//模拟过程
n=256  l=0 r=256
//0<=256 进入循环
//第1次循环
mid=(l+r)/2=(0+256)/2=128 ,mid * mid =128 * 128<=256 条件不满足 r=mid-1=128-1=127 l=0
//0<=127 条件满足
//第2次循环
mid=(l+r)/2=(0+127)/2=63, mid * mid =63 * 63 <=256 条件不满足,r=mid-1=63-1=62 l=0
//0<=62 条件满足
//第3次循环
mid=(l+r)/2=(0+62)/2=31, mid * mid =31 * 31 <=256 条件不满足,r=mid-1=31-1=30 l=0 
//0<=30 条件满足
//第4次循环
mid=(l+r)/2=(0+30)/2=15, mid * mid =15 * 15 =225 <=256 条件满足,l=mid+1=15+1=16 r=30    
//16<=30 条件满足
//第5次循环
mid=(l+r)/2=(16+30)/2=24, mid * mid =24 * 24<=256 不满足,r=mid-1=24-1=2 l=16
//16<=23 条件满足
//第6次循环
mid=(l+r)/2=(16+23)/2=19, mid * mid =19 * 19<=256 不满足,r=mid-1=19-1=18 l=16
//16<=18条件满足
//第7次循环
mid=(l+r)/2=(16+18)/2=17, mid * mid =17 * 17<=256 不满足,r=mid-1=17-1=16 l=16
//16<=16条件满足
//第8次循环
mid=(l+r)/2=(16+16)/2=16, mid * mid =16 * 16<=256 条件满足,l=mid+1=16+1=17 r=16     
//17<=16 条件不满足 退出循环
//返回 l-1 = 17 -1 =16

k为11,执行11次 x = (x + n / x) / 2;

第1次 x=(16+256/16)/2=16
第2次 x=(16+256/16)/2=16
....
第11次 x=(16+256/16)/2=16

所以选A

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796007.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二届熵密杯-广外女生青春版

晨曦初始谜题1 由源码可知,有固定的前缀,且长度为18,超过一个块的长度,可以通过求方程的形式先将key求出来,再将整个key带入解密函数得到加密前的字符串 求key # sage N_HEX = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123" N = Integer…

测评通义灵码,如何实现微信表情、 AI 语音笔记等小功能?

墨问西东是一家创业公司,很难一下子配齐像大公司那样的研发团队,这类 AI 编程辅助工具其实在一定程度上帮助我们的研发同学成长为全栈工程师,一个人就能顶上一个团队。内容来源 MacTalk 公众号,作者池建强 墨问西东是一家创业公司,很难一下子配齐像大公司那样的研发团队,…

一文看懂Prometheus告警原理及过程

本文详细介绍了如何在Prometheus中自定义告警规则,包括规则构成、Prometheus配置、告警流程以及告警解除的处理方法,特别关注了告警解除后的通知策略。摘要由CSDN通过智能技术生成目录 1. 自定义告警规则 2. 告警规则编写 3. prometheus配置 4. 告警过程 5. 告警解除 5.1 对s…

pytorch安装: cuda、cudatoolkit、torch版本对照

在 PyTorch 官网上有如下安装对照表,同时也有历史版本安装对照表从零开始配置python深度学习环境大概有如下配置步骤: 方案一: 电脑安装显卡驱动,然后安装CUDA、cuDNN,安装miniconda3。前面都是在电脑基础环境配置,后面的操作都是在conda环境中,安装torch、cudatoolkits…

AI实战 | 领克汽车线上营销助手:全面功能展示与效果分析

本篇文章的主要目的是为大家提供实现思路,以及如何更好地开发一个助手,而不仅仅是简单地进行拆解。如果采取拆解的方式,一篇文章可能会长达2万+字,还需要配以数十张图片,这将会非常繁琐。因此,针对拆解的详细内容,我计划单独制作一期视频,以帮助大家更清晰地理解。感谢…

ThreadLocal源码分析-

ThreadLocal源码分析 ThreadLocal是解决线程安全问题的一种方法,它通过为每个线程提供一个独立的变量副本避免了变量并发访问的冲突问题。一个ThreadLocal变量只与当前自身线程相关,对其他线程是隔离的。下面这段代码展示了ThreadLocal的使用。 public class test {private s…

Python打包完成后报错,如何解决?

大家好,我是Python进阶者。 一、前言 前几天在Python最强王者交流群【钟爱一生】问了一个Python打包处理数据的问题,问题如下: 打包完成后报错:发生错误:Missing optional dependency openpyxl.Use pip or conda to install openpyxl.哪位大佬帮我看一下错在哪了?二、实现…

408存储系统大题笔记

咸鱼25计组强化课P2的笔记,有点简陋。 课后需要把第三章的课后大题(真题做一下) Cache类题目做题要注意的点!!PA的位数=Cache地址总位数 Cache总行数 Cache块大小 第2和第3相乘得Cache数据区总大小(!=Cache总大小) 映射方式 一致性问题:写策略(直写/回写) 替换算法 CPU…

浅谈 C# 中的顶级语句

前言 在C# 9版本中引入了一项新特性:顶级语句,这一特性允许在不显式定义 Main 方法的情况下直接编写代码。 传统的写法namespace TestStatements{ internal class Program { static void Main(string[] args) { foreach (var arg in args) …

清理C盘缓存,清理C盘缓存的详细方法步骤

清理C盘缓存是优化Windows系统性能的重要步骤之一。以下是一些详细的方法来清理C盘缓存: 一、使用Windows内置工具磁盘清理 打开磁盘清理: 通过文件资源管理器右键点击C盘,选择“属性”,然后点击“磁盘清理”。 或者在“设置”中选择“系统” > “存储”,查看C盘的存储…

idea中的docker部署配置

注意:确认本地已安装docker环境 第一步:idea安装docker插件:设置-插件-docker第二步:配置Dockerfile文件FROM harbor.chint.com/wz-build-env-public/openjdk:17 AS base# 项目的端口,内部服务端口 EXPOSE 8808# 切换到容器内部的 /workdir目录 WORKDIR /workdir# 添加要运…

第十一章 图论 Part8

dijkstra(朴素版) 拓扑排序目录单源最短路径算法dijkstra(朴素版)适用范围(权值不能为负数的单源最短路径)思路算法正确性拓扑排序思路心得 单源最短路径算法 dijkstra(朴素版) 适用范围(权值不能为负数的单源最短路径) 思路 基本类似Prim算法,只是新加入(确定)点…