小明数(打表)

Description

小明比较喜欢研究各种各样的数字,有一天他发现了一类数,并将这些数命名为“小明数”,下面是“小明数”的定义:

数字的二进制由连续的k个1和连续的k-1个0组成。

比如:

1(二进制为:1,k=1)

6(二进制为:110,k=2)

120(二进制为:1111000,k=4)

496(二进制为:111110000,k=5)

现在给你一个数字n,求他所有的因子里最大的“小明数”。

Input

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10^5)

第2 - T + 1行:每行1个数n。(1 <= n <= 10^5)

Output

共T行每行对应每个测试用例的结果

Sample Input 1 

2
3
992

Sample Output 1

1
496

思路:刚开始没算好时间复杂度所以直接暴力在main函数里面

#include<iostream>
#include<cstring>
using namespace std;int a[100];
int b[100];
int huansuan(int n,int a[]) {int p=0;//一共p位数 while(n) {a[p]=n&1;n>>=1;p++;}
//	for(int i = p-1; i>=0; i--) {
//		cout<<a[i];
//	}
//	cout<<endl;return p;
}
bool ok(int x) {if(x==1) return true;int p = huansuan(x,b);int cnt0=0;for(int i = 0; i<p; i++) {if(b[i]==0) cnt0++;else break;}if(cnt0*2+1!=p) return false;//因为这里要考虑到cnt0==0的情况,也就是想到了x==1的情况了 for(int i = cnt0; i<p; i++) {if(b[i]!=1) return false;}return true;}
int main()
{int n,t;cin>>t;while(t--) {memset(a,0,sizeof(a));cin>>n;huansuan(n,a);for(int i = n-1; i>=0; i--) {if(ok(i)) {printf("%d\n",i); break;}}}return 0 ;}

而且没加上是因子的判断,,,很失败、、

TLE之后发现打表,刚开始的打表也是失败的:

//超时做法 
#include<iostream>
#include<cstring>
using namespace std;int a[100];
int b[100];
int db[100005];int huansuan(int n,int a[]) {int p=0;//一共p位数 while(n) {a[p]=n&1;n>>=1;p++;}
//	for(int i = p-1; i>=0; i--) {
//		cout<<a[i];
//	}
//	cout<<endl;return p;
}
bool ok(int x) {if(x==1) return true;int p = huansuan(x,b);int cnt0=0;for(int i = 0; i<p; i++) {if(b[i]==0) cnt0++;else break;}if(cnt0*2+1!=p) return false;//因为这里要考虑到cnt0==0的情况,也就是自然想到x==1的情况了 for(int i = cnt0; i<p; i++) {if(b[i]!=1) return false;}return true;}
void dabiao() {db[1]=db[2]=1;for(int i = 2; i<=10005; i++) {memset(a,0,sizeof(a));memset(b,0,sizeof(b));huansuan(i,a);for(int j = i-1; j>=db[i]; j--) {//这样并不能简化运算,复杂度甚至更高了,不像筛法求素数一样,因为这个不是记忆化,if(ok(j)) {					//也就是,你虽然k那层for循环更新了db值,但并不一定是最终结果,所以意义不大 db[i]=j;				//建议在看一看线性时间筛法求素数中是怎么降低时间复杂度的!那才是真正的记忆化!for(int k = i+db[i]; k<=10005; k+=db[i]) {//你这个记忆化卵用没有,只是先找到了较优解,并非最优解所以此处无意义。 db[k]=db[i];						//	只有A*算法类似的才需要较优解,其余情况需要记忆的是最优解才有意义。 }break;}}}}
int main()
{int n,t;scanf("%d",&t);dabiao(); while(t--) {scanf("%d",&n);printf("%d\n",db[n]);}return 0 ;} 

依旧TLE,并且比时间复杂度略高于直接双层for,(ps:其实直接双层for时间复杂度也是o(n^2),虽然内层不是1~100005,但是取平均,,去掉系数,依旧是o(n^2)  

下面是思考后的打表:

#include<iostream>
#include<cstring>
using namespace std;
int db[10];
int cnt=0;
void dabiao() {db[0]=1;cnt++;db[1]=6;cnt++;//cnt=2;int n=6;int tmp1,tmp2;while(n<=100005) {tmp1=n<<2;n=db[cnt]=tmp1+( 1<<cnt );//需要加括号!!! 
//		cout<<db[cnt]<<endl;cnt++;}}
int main()
{int n,t;scanf("%d",&t);dabiao(); 
//	for(int i = 0; i<cnt; i++) {
//		printf("%d\n",db[i]);
//	}while(t--) {scanf("%d",&n);if(n==1) {printf("1\n");continue;} for(int i = cnt-2; i>=0; i--) {//小细节!需要-1!不然就爆零了! if( n>=db[i] && (n%db[i]==0)) {printf("%d\n",db[i]);break;}}}return 0 ;} /*
1
6
28
120
496
2016
8128
32640
130816*/


24ms运行时间、、、还有一点要注意的是,因子的定义!!eg : 6是6的因子!所以

 n>=db[i]

等号不能拉下!!很气、、

总结:先看题啊算一算时间复杂度,这题数据量1e5,所以不打表就至少1e10,肯定TLE,所以打表是肯定的了,再审题,发现不需要像第一版那样去遍历1e5来找符合小明数的;而应该,根据题目小明数的特点,直接位运算,得到若干个小明数,即:你可以直接找出这些小明数(并且一共就不多,就8个),那为什么还要遍历求呢?直接算把次就好了啊,或者直接提前算好然后再数组里直接赋值初始化,极好极好。

另附网络版:用快速幂做的,但是个人感觉没有必要:


#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <string>  
using namespace std;  
int a[100000];  
int cnt = 0;  
int q_pow(int a,int b){  int ans = 1;  while(b){  if(b&1)  ans *= a;  b >>= 1;  a *= a;  }  return ans;  
}  
void getnum(){  int t = 1;  int num;  do{  int tmp = 2 * t - 2;  int tmp2 = t;  num = 0;  while(tmp2){  num += q_pow(2,tmp);  tmp2--;  tmp--;  }  if(num < 100000) a[cnt++] = num;  t++;  }while(num < 100000);  
}  
int main(){  getnum();  for(int i = 0; i<cnt; i++) {cout<<a[i]<<endl;} int t,n;  scanf("%d",&t);  while(t--){  scanf("%d",&n);  for(int i = cnt-1; i >= 0; i--){  if(n % a[i] == 0){  printf("%d\n",a[i]);  break;  }  }  }  return 0;  
} 
/*
1
6
28
120
496
2016
8128
32640
*/ 




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

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

相关文章

素数环(dfsamp;amp;STL做法)HDU - 1016

HDU - 1016 cxsys训练第一周&第二周A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime. Note: the number of first circle should…

微型计算机及接口技术试卷,微机原理及接口技术试题以及答案

38.如要选择2PSW(地址为DOH)的格式为39.执行下列指令组后&#xff0c;(A)_________标志位(OV)_________(P)_________MOV A&#xff0c;#0B4HADD A,#00HSUBB A,#51H40.执行下列指令组后&#xff0c;累加器(A)_________。它与R1中内容的关系是_________MOV R1&#xff0c;#87HMOV…

五年级数学8课时用计算机探索规律,小学五年级数学《用计算器探索规律》教案范文三篇...

教案包括教材简析和学生分析、教学目的、重难点、教学准备、教学过程及练习设计等。下面就是小编给大家带来的小学五年级数学《用计算器探索规律》教案范文&#xff0c;欢迎大家阅读!小学五年级数学《用计算器探索规律》教案范文一教学目标&#xff1a;1.使学生借助计算器的计算…

对记忆化搜索(ms)和动态规划(dp)的深入理解

六月中旬了&#xff0c;马上就要期末考试了&#xff0c;期末考试结束以后就要迎来紧张刺激的留校集训&#xff0c;到那时博客会更新的比较频繁&#xff0c;而现在在准备期末考试&#xff0c;所以可能更新的博客稍微少一些。话不多说&#xff0c;今天来更一篇刚刚吃饭的时候关于…

史密斯圆图的使用

史密斯圆图的使用 简介识别史密斯圆图等反射系数圆归一化阻抗圆导纳圆图史密斯圆图的使用单支匹配双支匹配简介 史密斯图Smith Chart是电气工程,无线电,射频工程,微波工程和通信等领域常用的一种图示工具,用于分析和设计传输线和阻抗匹配网络,它由美国工程师Phillip H.Sm…

html5触边反弹,第四章课件.PPT_数字电子技术基础(ppt课件)_ppt_大学课件预览_高等教育资讯网...

第 4章 触发器电路授课计划教学内容教学小结一、授课计划1、教学目标1,熟练掌握基本 RS触发器的工作原理,逻辑功能, 及钟控 RS触发器, JK触发器,D触发器的逻辑功能, 时间波形图, 特性方程 。2,理解钟控 RS触发器, JK触发器, D触发器电路的工作原理, 特点, 相互之间的转换及常用…

一发模拟水题但是RE,暑假抽个时间改一改、、

这是我们实验室纳新考试的A题&#xff0c;简单模拟。 话不多说上题干&#xff1a;哲哲晔晔很难受Description哲哲和晔晔最喜欢一起睡懒觉了&#xff01;可老师又特别喜欢点名&#xff0c;所以每个第一节有课的早晨&#xff0c;他们都会很难受。因为起床太晚了他们每次都要跑着去…

莆田学院计算机科学与技术分数,莆田学院录取分数线2021是多少分(附历年录取分数线)...

莆田学院录取分数线2020是多少分&#xff0c;各专业录取分数线是多少&#xff0c;是每个填报莆田学院的考生最关注的问题&#xff0c;随着各省高考录取批次相继公布&#xff0c;考生也开始关心是否被录取&#xff0c;本站小编整理相关信息供参考&#xff0c;仅供参考。一、莆田…

一道水的不能再水的题目

Description一个n&#xff0c;代表一共有多少个数&#xff0c;接下来给你n个数&#xff0c;让你求一个m&#xff0c;使得前m个数的和大于等于n个数总和的一半.Input一个n&#xff08;0<n<10000&#xff09;代表一共有多少个数&#xff0c;接下来n个数&#xff08;1~300&a…

w7系统计算机e盘无法打开,Win7电脑磁盘打不开怎么办

Win7系统电脑磁盘出现异常&#xff0c;不管是C盘、D盘还是E盘都打不开&#xff0c;并且还出现“位置不可用 无法访问 E&#xff1a;\ 拒绝访问”的提示。那么Win7磁盘打不开怎么办呢?下面是学习啦小编给大家整理的一些有关Win7电脑磁盘打不开的解决方法&#xff0c;希望对大家…

快速幂模板

最近准备期末考试有点枯燥&#xff0c;&#xff0c;就更新点水题上来或者模板上来啦&#xff0c;也算是整理一下实验室电脑的文件&#xff0c;&#xff0c;太多太杂了。 模板如下&#xff1a;&#xff08;等暑假开始了&#xff0c;我再把矩阵快速幂的模板放上来&#xff09; #i…

培智计算机教学论文,【培智数学论文】_培智数学教学论文

课件架桥,点亮思维——谈多媒体在培智数学教学中的有效运用随着素质教学改革的深入,课堂教学模式也逐步从传统单一的教授式转入到创新多元化的探究式.教师,也逐步从传道者转化为引领者,学生,更是从课堂的配角转化为探究的主体.新型的教学模式,需要更先进的教学手段介入.而信息化…

快期末考试了好烦躁啊来写点东西

最近是真的烦躁&#xff0c;&#xff0c;偶然的机会加了一个四非保研群&#xff0c;无数次的感受到了这个世界对非985非211学校的歧视&#xff0c;而你对此只能无奈&#xff0c;却无能为力。里面说了很多考研的途径和一些需要注意的事情&#xff0c;比如九推啊夏令营啊等等新名…

大学计算机二级培训蹭课,本人在复旦大学蹭课总结的一点小小的经验

1、尽量早点去蹭课&#xff0c;因为会有很多复旦的学生去占座&#xff0c;特别是专业课上他们的到座率很高,所以最好群里面约好了结伴同行&#xff0c;这样的话&#xff0c;谁先到就可以给同伴占个座了;2、去的时候尽可能穿得像个学生&#xff0c;带几本相关的书&#xff0c;毕…

距离高考出成绩,一年了、、、

去年2017.6.24日&#xff0c;下午4点&#xff0c;怀着紧张的心情&#xff0c;&#xff0c;&#xff0c;查看了自己的高考分数。 今年2017.6.24日&#xff0c;下午4点&#xff0c;不知道为什么&#xff0c;同样心里怦怦直跳。 一年了啊&#xff0c;进入大学&#xff0c;选择cs专…

计算机采购类增值税税率是多少,各个行业的税率是多少?

关于税收的种类&#xff0c;楼下税里税外 的回答非常全面。因为2018年的增值税率调整&#xff0c;我重点再说说调整后各行业的增值税税率&#xff0c;并比较下小规模和一般纳税人的税率的差别。也许对各位老板朋友有帮助。增值税的税率可以分为两类税率(4种)&#xff1a;16%&am…

据说200G网盘资料

来源&#xff1a;HACK学习呀2015cracer入侵入门到精通视频教程点我查看trf3一笔√带过入侵教程点我查看ypan〔复仇者〕新手入门系列(7套)点我查看g1tb菜鸟入门&#xff0c;做的确实不错点我查看q0oh菜鸟基础(10套)点我查看2zq6小迪渗透第十期点我查看u5sv计算机网络点我查看v14…

新出计算机语言有哪些,2020年最新编程语言排名(十大编程语言的比较)

2020年最新几天前&#xff0c;编程语言社区TIOBE最近发布了三月份的编程语言排名.在最新的编程语言排名中&#xff0c;前5名排名没有明显变化. 但是&#xff0c;与以前的报告相比&#xff0c;最受欢迎的开发人员仍然是Java 8和Java 11.十大编程语言排名此外&#xff0c;在上个月…

51nod 1091 重叠的线段(贪心)

题干&#xff1a; X轴上有N条线段&#xff0c;每条线段包括1个起点和终点。线段的重叠是这样来算的&#xff0c;[10 20]和[12 25]的重叠部分为[12 20]。 给出N条线段的起点和终点&#xff0c;从中选出2条线段&#xff0c;这两条线段的重叠部分是最长的。输出这个最长的距离。如…

计算机编程老鸟的心得,java入门123——一个老鸟java学习心得.docx

java入门123——一个老鸟的java学习心得学习Java心得体会  学习了一学期的Java课程,觉得是该总结自己的心得体会了。开始学习任何一门课(包括java)&#xff0c;兴趣最重要。一直觉得自己在学计算机编程语言&#xff0c;学习了很多&#xff0c;但每门语言都停留在知识边缘地带…