试题答案_找符合条件的整数

2020计算机挑战赛Java组真题 A.privateB.publicC.default。 阅读详情

 分析与解法

题目中的直接做法显然不是一个令人满意的方法。还有没有其他的方法呢?答案是肯定的。

可以做一个问题的转化。由于问题中要求N * M的十进制表示形式里只含有1和0,所以N * M与M相比有明显的特征。我们不妨尝试去搜索它们的乘积N * M,这样在某些情况下需要搜索的空间要小很多。另外,搜索N * M,而不去搜索M,其实有一个更加重要的原因,就是当M很大时,特别是当M大于232时,某些机器就可能没法表示M了,我们就得自己实现高精度大整数类。但是考虑N * M的特点,可以只存储N * M的十进制表示中“1”的位置,这样就可以大大缩小表示N * M所需要的空间,从而使程序能处理数值很大的情况。因此,考虑到程序的推广性,选择了以N * M为目标进行计算。

换句话说,就是把问题从“求一个最小的正整数M,使得N * M的十进制表示形式里只含有1和 0 ” 变成求一个最小的正整数X,使得X的十进制表示形式里只含有1和0,并且X被N整除。

我们先来看一下X的取值,X从小到大有如下的取值:1、10、11、100、101、110、111、1000、1001、1010、1011、1100、1101、1110、1111、10000、……

如果直接对X进行循环,就是先检查X=1是否可以整除N,再检查X=10,然后检查X=11,接着检查X=100…(就像遍历二进制整数一样遍历X的各个取值)。

但是这样处理还是比较慢,如果X的最终结果有K位,则要循环搜索2K次。由于我们的目标是寻找最小的X,使得X mod N= 0,我们只要记录mod N = i(0 <= i < N)的最小X就可以了。这样通过避免一些不必要的循环,可以达到加速算法的目的。那么如何避免不必要的循环呢?先来看一个例子。

设N=3,X=1,再引入一个变量J,J = X % N。直接遍历X,计算中间结果如表2-1所示。

表2-1

Num

1

2

3

4

5

6

7

N

3

3

3

3

3

3

3

X

1

10

11

100

101

110

111

J

1

1

2

1

2

2

0

表2-1计算110 % 3是多余的。原因是1和10对3的余数相同,所以101和110对3的余数相同,那么只需要判断101是否能整除3就可以了,而不用判断110是否能整除3。并且,如果X的最低3位是110,那么可以通过将101替换110得到一个符合条件的更小正整数。因此,对于mod N同余的数,只需要记录最小的一个。

有些读者可能会问,当X循环到110时,我怎么知道1和10对3的余数相同呢?其实,X=1,X=10是否能整除3,在X循环到110时都已经计算过了,只要在计算X=1,X=10时,保留X % N的结果,就可以在X=110时作出判断,从而避免计算X % N。

以上的例子阐明了在计算中保留X除以N的余数信息可以避免不必要的计算。下面给出更加形式化的论述。

假设已经遍历了X的十进制表示有K位时的所有情况,而且也搜索了X=10K的情况,设10K%N = a。现在要搜索X有K+1位的情况,即X=10K+Y,(0<Y<10K)。如果用最简单的方法,搜索空间(Y的取值)将有2K-1个数据。但是如果对这个空间进行分解,即把Y按照其对N的余数分类,我们的搜索空间将被分成N-1个子空间。对于每个子空间,其实只须要判断其中最小的元素加上10K是否能被N整除即可,而没有必要判断这个子空间里所有元素加上10K是否能被N整除。这样搜索的空间就从2K-1维压缩到了N-1维。但是这种压缩有一个前提,就是在前面的计算中已经保留了余数信息,并且把Y的搜索空间进行了分解。所谓分解,从技术上讲,就是对于“X模N”的各种可能结果,保留一个对应的已经出现了的最小的X(即建立一个长度为N的“余数信息数组”,这个数组的第i位保留已经出现的最小的模N为i的X)。

那么现在的问题就是如何维护这个“余数信息数组”了。假设已经有了X的十进制表示有K位时的所有余数信息。也有了X=10K的余数信息。现在我们要搜索X有K+1位的情况,也即X=10K+Y,(0<Y<10K)时,X除以N的余数情况。由于已经有了对Y的按除N的余数进行的空间分解情况,即Y<10K的余数信息数组。我们只须要将10K%N的结果与余数信息数组里非空的元素相加,再去模N,看看会不会出现新的余数即可。如果出现,就在余数信息数组的相应位置增添对应的X。这一步只须要N次循环。

综上所述,假设最终的结果X有K位,那么直接遍历X,须要循环2K次,而按照我们保留余数信息避免不必要的循环的方法,最多只需要(K-1)*N步。可以看出,当最终结果比较大时,保留余数信息的算法具有明显的优势。

下面是这个算法的伪代码:BigInt[i]表示模N等于i的十进制表示形式里只含1和0的最小整数。由于BigInt[i]可能很大,又因为它只有0和1,所以,只须要记下1的位置即可。比如,整数1001,记为(0, 3)= 100+103。即BigInt的每个元素是一个变长数组,对于模N等于i的最小X,BigInt的每个元素将存储最小X在十进制中表示“1”的位置。我们的目标就是求BigInt[0],如代码清单2-17所示。

代码清单2-17

// 初始化

     for(i = 0; i < N; i++)

          BigInt[i].clear();

     BigInt[1].push_back(0);

 

     int NoUpdate = 0;

     for(i=1,j=10%N; ; i++,j=(j*10)%N)

     {

          bool flag = false;

          if(BigInt[j].size() == 0)

          {

               flag = true;

               // BigInt[j] = 10^i, (10^i % N = j)

               BigInt[j].clear();

               BigInt[j].push_back(i);

          }

          for(k = 1; k < N; k++)

          {

               if((BigInt[k].size() > 0)

                    && (i > BigInt[k][BigInt[k].size() - 1])

                    && (BigInt[(k + j) % N].size() == 0))

               {

                    // BigInt[(k + j) % N] = 10^i + BigInt[k]

                    flag = true;

                    BigInt[(k + j) % N] = BigInt[k];

                    BigInt[(k + j) % N].push_back(i);

               }

          }

          if(flag == false) NoUpdate++;

          else NoUpdate=0;

          // 如果经过一个循环节都没能对BigInt进行更新,就是无解,跳出。

          // 或者BigInt[0] != NULL,已经找到解,也跳出。

          if(NoUpdate == N || BigInt[0].size() > 0)

               break;

     }

     if(BigInt[0].size() == 0)

     {

          // M not exist

     }

     else

     {

          // Find N * M = BigInt[0]

     }

在上面的实现中,循环节取值N(其实循环节小于等于N,循环节就是最小的c,使得 10c mod N = 1)。

这个算法其实部分借鉴了动态规划算法的思想。在动态规划算法的经典实例“最短路径问题”中,当处理中间结点时,只须要得到从起点到中间结点的最短路径,而不需要中间结点到那个端点的所有路径信息。“只保留模N的结果相同的X中最小的一个”的方法,与此思路相似。

扩展问题

1.    对于任意的N,一定存在M,使得N * M的乘积的十进制表示只有0和1吗?

2.    怎样找出满足题目要求的N和M,使得N * M < 216,且N+M最大?

 

相关资源:

《编程之美》编辑部 | 《编程之美》豆瓣 | 《编程之美》互动网购买 | 作者Blog

作者豆瓣

Shopee后端提前批笔试复盘:题型、考点与实战策略 在现代后端岗位招聘中,线上笔试已成为技术人才筛选的关键环节,其核心逻辑在于通过算法题与基础选择题的组合,综合评估候选人的工程基础与逻辑思维。算法题部分往往聚焦于数组、双指针、动态规划、图论等高频数据结构,要求开发者不仅掌握模板解法,更需理解复杂度分析与边界处理;而计算机网络、操作系统、数据库等基础题则检验对后端技术栈底层原理的掌握程度。笔试平台通常采用部分用例判分机制,合理的策略是先使用暴力解法获取保底分,再逐步优化。针对Shopee后端岗提前批,真题复盘表明,熟悉题型分布、时间分配与输入输出细节的候选者, 阅读详情

相关推荐

编程之美——找符合条件的整数

题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0.解决这个问题首先考虑对于任意的N,是否这样的M一定存在。可以证明,M是一定存在的,而且不唯一。简单证明:因为 这是一个无穷数列,但是数列中的每一项取值范围都在[0, N-1]之间。所以这个无穷数列中间必定存在循环节。即假设有s,t均是正整数,且s,所以例如,取N=3,因为10的任何

jcwKyl的专栏 8941

python:

查找在[m,n]范围内是否有同时满足下列条件的正整数: (1)对3取余等于1,对7取余等于2,对11取余等于3 (2)是一个素数 例如区间【700, 800】内有751满足条件。区间【1200,1300】内有1213满足条件,区间【2100,2200】内有2137满足条件。 如果一个区间内有多个数据满足条件,输出最小的那个。如果没有任何数据满足条件,输出“none” 输入:两个正整数m和n,表示闭区间[m,n],题目保证:1≤m≤n≤100,000,000,两个数据之间用空格隔开。输出:一行。如果找到

qq_70079028的博客 1138

机器学习面试笔试求职必背!八股文(1/5)

算法工程师,技术软件类求职机器学习必背八股文 更多算法/业务/HR面等笔试题面试题 —— >个性签名自取! 1. 特征工程: 1.1 为什么要对特征做归一化处理: Feature scaling,常见的提法有“特征归一化”、“标准化”,是数据预处理中的重要技术。特征间的单位(尺度)可能不同,比如身高和体重,比如摄氏度和华氏度,比如房屋面积和房间数,一个特征的变化范围可能是[ 1000 , 10000 ] [1000, 10000][1000,10000],另一个特征的变化范围可能是[ −.

大厂offer宝典 1万+

C语言编程作业

C语言课程作业,留存

longTT_TT的博客 8211

链式中介效应结果解读:从Bootstrap置信区间到实践意义

本文深入解析链式中介效应结果的解读方法,从Bootstrap置信区间的应用到实践意义的阐述。通过实际案例展示如何分析总效应、直接效应和间接效应,并强调效应量评估的重要性。文章还提供了构建逻辑解释的三步法,以及敏感性分析和报告撰写的实用技巧,帮助研究者准确解读链式中介效应。

weixin_33690367的博客 718

海康机器人ID5000 系列智能读码器(三)

又過了兩個月,漸漸的對這個攝像頭的功能更加熟悉了,而實際上,我要做的功能也越來越複雜,從一開始的讀碼,到後來的通過讀二維碼控制設備,再到未讀到二維碼控制設備等,下面就對具體的細項做一個總結。了解完這些就能對ID5000這個設備,乃至很多海康的設備都能做一個二次開發。

qq_54359036的博客 3073

【PTA】查找满足条件的最后一个整数 (15分)

本题要求编写程序,将输入的n个整数存入数组a中,然后在数组a中查找给定的x。如果数组a中的元素与x的值相同,输出满足条件的最后一个元素的下标(下标从0开始);如果没有找到,输出“Not Found”。 输入格式: 输入在第1行中给出一个正整数n(1≤n≤100)和一个整数x,第2行输入n个整数,其间以空格分隔。题目保证数据不超过长整型整数的范围。 输出格式: 如果找到,输出与x的值相同的最后一个元...

ReganYue's Blog 5610

安装m_map以及用matlab绘制高精度海岸线地图

#如何用matlab绘制高精度海岸线地图

qq_38512775的博客 1万+

PTA本题要求编写程序,对顺序读入的n个整数,顺次计算后项减前项之差,并按每行三个元素的格式输出结果。

本题要求编写程序,对顺序读入的n个整数,顺次计算后项减前项之差,并按每行三个元素的格式输出结果。 输入格式: 输入的第一行给出正整数n(1<n≤10)。随后一行给出n个整数,其间以空格分隔。 输出格式: 顺次计算后项减前项之差,并按每行三个元素的格式输出结果。数字间空一格,行末不得有多余空格。 输入样例: 10 5 1 7 14 6 36 4 28 50 100 输出样例: -4 6 7 -8 30 -32 24 22 50 int main() { int i, j, n

Tomatos_baby的博客 1万+

量化投资从0开始系列 ---- 15. 郑商所日统计数据

前面已经提取了其它期货交易所的数据,最后还剩下郑商所。相比而言,郑商所的数据获取比其它几个交易所更麻烦一点。因为郑商所的系统接口有两个,在2015年11月11日前后发生了切换,这个日期之前是老系统的api接口,这个日期之后是一个新的api接口。 具体的地址在哪里,还是依靠在浏览器中按F12来确定,最后发现的地址是: if trade_date > '20151111': czce_url = f'http://www.czce.com.cn/cn/DFSS

kengxie的博客 2113

高效爬取懂车帝车型数据:从静态解析到动态反爬实战

本文详细解析了如何高效爬取懂车帝车型数据,从静态HTML解析到动态接口反爬的完整实战路径。文章重点介绍了使用浏览器开发者工具定位数据、应对CSS混淆与参数加密等反爬策略,并提供了整合静态与动态抓取逻辑的Python代码示例,帮助开发者稳健地获取结构化车型信息。

wind6的博客 937

C语言:查找指定数据

如果找到满足题目要求的数据,则输出这个数;如果有多个数据,输出其中最小的那个。如果一个数据都没有,输出“none”两个正整数m和n,表示闭区间[m,n],题目保证:1≤m≤n≤100,000,000,两个数据之间用空格隔开。(1)对5取余等于1,对7取余等于3,对11取余等于5。

2201_75833091的博客 750

华为OD机试 - 猴子吃桃 - 二分查找(Java 新系统 100分)

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 3850

c语言三级试题答案,年9月计算机等级考试三级C语言上机试题

年9月计算机等级考试三级C语言上机试题XXXX年9月计算机等级考试三级C语言上机试题试题1:机试时间:9月23日15:30机试试题:南开67(整数各位数字运算题)下列程序的功能是:选出5000以下符合条件的自然数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的10倍。计算并输出这些四位自然数的个数cnt以及这些数的和sum。请编写函数...

weixin_32797081的博客 269

YOLOv8改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用

本文记录的是利用双级路由注意力机制优化的目标检测网络模型。传统的复杂度高,随着输入空间分辨率增加,计算量呈平方增长,导致严重的可扩展性问题。而本文所使用的在获取全局信息的同时,通过区域到区域路由和令牌到令牌注意力的合理设计,减少了不必要的计算量。BiFormer: Vision Transformer with Bi-Level Routing Attention采用四阶段金字塔结构,与一些先进的视觉Transformer类似。在每个阶段,首先使用重叠的补丁嵌入(在第一阶段)或补丁合并模块(在第二到第四阶段

Limiiiing的博客 614

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

2019第十届蓝桥杯b组C++部分题目答案

试题 A:组队 本题总分:5分 【问题描述】 作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员, 组成球队的首发阵容。 每位球员担任 1号位至 5号位时的评分如下表所示。请你计算首发阵容 1 号位至5号位的评分之和最大可能是多少? 答案:490 思路:直接手算(注意:1~5号位必须是编号不同的人) 试题 C:数列求值 本题总分:10分 【问题描述】 给定数列1,1,...

knwceas 2609

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

c语言三级试题答案,全国计算机三级C语言上机题库(附答案).doc

三级机试题库(附答案)1、已知数据文件IN.DAT中存有200个四位数, 并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:依次从数组a中取出一个四位数,如果该四位数大于该四位数以后的连续五个数且该数是偶数(该四位数以后不满五个数,则不统计), 则统计出满足此条件的个数cnt并把这些四位数按从小到大的顺序存入数组b中,最后调用写函数writeDat()...

weixin_34797871的博客 662

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【PTA题目解答】7-7 输出数组元素 (15分)

7-7输出数组元素(15分) 本题要求编写程序,对顺序读入的n个整数,顺次计算后项减前项之差,并按每行三个元素的格式输出结果。 输入格式: 输入的第一行给出正整数n(1<n≤10)。随后一行给出n个整数,其间以空格分隔。 输出格式: 顺次计算后项减前项之差,并按每行三个元素的格式输出结果。数字间空一格,行末不得有多余空格。 输入样例: 10 5 1 7 14 6 36 4 28 50 100 输出样例: -4 6 7 -8 30 -32 24 22 50 又是一道感觉用不上..

doreaming的博客 2万+

【PTA题目解答】7-3 查找满足条件的所有整数

7-3 查找满足条件的所有整数 (15分) 本题要求编写程序,将输入的n个整数存入数组a中,然后在数组a中查找给定的x。如果数组a中的元素与x的值相同,输出所有满足条件的元素的下标(下标从0开始);如果没有找到,输出“Not Found”。 输入格式: 第1行输入一个正整数n(0<n≤10)和一个整数x,第2行输入n个整数,其间以空格分隔。题目保证数据不超过长整型整数的范围。 输出格式: 如果找到,输出所有与x的值相同的元素的下标,每行输出一个下标;如果没有找到,在一行中输出“Not Fou

doreaming的博客 1万+

【C语言】求符合给定条件的整数集

求符合给定条件的整数集 PTA 基础编程题集 7-16 题目: 给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。* 输入格式: 输入在一行中给出A。 输出格式: 输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。(输出要以升序的方式) 可能有多种解法,这里提供一种方法,供大家学习交流,可能没有那么易懂,但起初想到了这个思路,就试着写了一下。 先说思路: 输入一个整数——>得到这个整数的后三位——>存进数组1;

qq_47413097的博客 1809

C语言入门:求符合给定条件的整数集

C语言:求符合给定条件的整数集 给定不超过6的正整数,考虑从A开始的连续4个数字。请输出所有由他们组成的无重复数字的3位数 输入格式:输入在一行中给出A 输出格式:输出满足条件的3位数,要求从小到大,每行6个整数,整数间以空格分隔,但行末不能有多余空格 ...

JasonLi808的博客 4999

4-0. 求符合给定条件的整数集

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。 输入格式: 输入在一行中给出A。 输出格式: 输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。 输入样例: 2 输出样例: 234 235 243 245 253 254 324 325 342 345 352...

ProgramMonkey2014的专栏 1558

找符合条件的整数

题目:      任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式只含有1和0 。 分析:      将问题“求一个最小的正整数M,使得N*M的十进制表示形式里只含有1和0”转换为求一个最小的正整数X,使得X的十进制表示形式里只含有1和0,并且X被N整除。

雪儿的专栏 1076

7-3 查找满足条件的所有整数 (15 分)

本题要求编写程序,将输入的n个整数存入数组a中,然后在数组a中查找给定的x。如果数组a中的元素与x的值相同,输出所有满足条件的元素的下标(下标从0开始);如果没有找到,输出“Not Found”。 输入格式: 第1行输入一个正整数n(0<n≤10)和一个整数x,第2行输入n个整数,其间以空格分隔。题目保证数据不超过长整型整数的范围。 输出格式: 如果找到,输出所有与x的值相同的元素的下标,每行输出一个下标;如果没有找到,在一行中输出“Not Found”。 输入样例1: 5 9 2 9

weixin_61350798的博客 1615

7-12 查找满足条件的所有整数 (15 分)

本题要求编写程序,将输入的n个整数存入数组a中,然后在数组a中查找给定的x。如果数组a中的元素与x的值相同,输出所有满足条件的元素的下标(下标从0开始);如果没有找到,输出“Not Found”。 输入格式: 第1行输入一个正整数n(0<n≤10)和一个整数x,第2行输入n个整数,其间以空格分隔。题目保证数据不超过长整型整数的范围。 输出格式: 如果找到,输出所有与x的值相同的元素的下标...

fzl编程新手的博客 9903

7-7 输出数组元素(15 分)

7-7 输出数组元素(15 分) 本题要求编写程序,对顺序读入的n个整数,顺次计算后项减前项之差,并按每行三个元素的格式输出结果。 输入格式: 输入的第一行给出正整数n(1n≤10)。随后一行给出n个整数,其间以空格分隔。 输出格式: 顺次计算后项减前项之差,并按每行三个元素的格式输出结果。数字间空一格,行末不得有多余空格。 输入样例: 10 5 1 7 14

人潮拥挤啊我好多余 3万+
上一篇: 写给念IT专业大一表弟的一封信(转)
下一篇: Job Hunting问题总结之必看书目(转)
BOPGroup
博客等级 码龄17年 2525粉丝 306原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值