题目

史密斯数(smith.cpp,1s,128MB)

【问题描述】:

  美国有一位数字家名叫阿尔伯特·威兰斯基,他姐夫史密斯非常喜欢研究数学,所以两人经常在一起研讨各种数学问题。有时,两人碰不到一起,就习惯性地用电话交流。

两人刚结束电话交谈,史密斯突然灵感来临,对威兰斯基的电话号码“4937775”产生了兴趣,总觉得这是个特别的数。可它的特殊之处究竟在哪儿呢?史密斯开始思索考证起来,他先把 4937775 分解质因数:4937775=3×5×5×65837,然后再把 4937775 所有质因数各位上的数字相加得:3+5+5+6+5+8+3+7=42,接着他又把 4937775 各位上的数字相加得:4+9+3+7+7+7
+5=42,秘密终于找到了,原来这两个和相等。这真有意思,难道是巧合么?有没有其他的数也有此特点呢?结果发现,所有质数都是具有如此特点。
后来的数学家们把这样的数叫做“史密斯数”,而且还决定质数(简单不复杂)不属于斯密斯数。除质数之外还有许多数具有这样独特的性质,其中最小的数是 4。大家不妨检查一下,4=2×2,2+2=4。类似有,22=2×11,2+2=2+1+1;27=3×3×3,2+7=3+3+3。
你的任务是寻找最接近而且大于给定的数的斯密斯数。

【输入文件】:

   只有一行一个整数 N,N 不超过 8 位数字。

【输出文件】:

  一个整数,即第一个大于给定的数的斯密斯数。

【输入输出样例】:

smith.in
4937774
smith.out
4937775

【数据规模】:

考试得分:  0

主要算法 :  质数(欧拉素数筛)

应试策略:

  1.   可以明确的是,考试时题目都没有看懂,到底什么是斯密斯数(没有质数哦!),考试时将质数也看作斯密斯数了
  2. 错误中又将真正的斯密斯数打表打出,等了1500多秒,因为想要现将素数筛出,只需要O(n),能跑,但非质数“斯密斯数”*(史密斯数)就有点难跑了,所以打表(其实这就是foolish的想法,因为会爆掉代码50KB的限制,事实上是2.XXMB,)
  3. 将“斯密斯数”放入到一个数组中二分查找(真的有点stupid)

  代码:

#include<map>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#define FORa(i,s,e) for(int i=s;i<=e;i++)
#define FORs(i,s,e) for(int i=s;i>=e;i--)
#define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,10000,stdin),pa==pb)?EOF:*pa++
#define File(name) freopen(name".in","r",stdin),freopen(name".out","w",stdout)using namespace std;
static char buf[10000],*pa=buf,*pb=buf;
inline int read();const int N=4000000,BN=278412;
int n,cnt,prime[N+1],v[N+1];
int a[BN+4]={4,22,27,58,85,94,121,166,202,}//后面的省略,不然上传不了啊!
map<int,bool> mp;
void Oulashai()
{FORa(i,2,n){if(!v[i]) v[i]=i,prime[++cnt]=i,mp[i]=1;FORa(j,1,cnt){if(prime[j]>v[i]||prime[j]*i>n) break;v[prime[j]*i]=prime[j];}}
}
int Back(int x)
{int cnt=0;while(x) cnt=cnt+x%10,x/=10;return cnt;
}
bool Check(int x)
{int fx=x,cnt1=0,cnt2=Back(x);FORa(i,2,sqrt(fx)) {int ct=0,backi=Back(i);if(fx%i==0){while(fx%i==0){fx/=i,ct++;    if(cnt1+ct*backi>cnt2) return 0;} cnt1=cnt1+ct*backi;        }}if(fx>1) cnt1+=Back(fx);return cnt1==cnt2;
}
int main()
{File("smith");n=read(),Oulashai();
/*    FORa(i,1000000,n){if(!mp[i])if(Check(i))printf("%d,",i);}*/FORa(i,0,BN+2) mp[a[i]]=1;FORa(i,n+1,N+20){if(mp[i]) {printf("%d",i);exit(0);    }}return 0;
}
inline int read()
{register int x(0);register int f(1);register char c(gc);while(c<'0'||c>'9') f=c=='-'?-1:1,c=gc;while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc;return x*f;
}

非完美算法:  

  请看正解

正解:

  1.   已知大于N的最大的斯密斯数为N的最大值的基础上加上2000左右(打表小函数得出),筛选1到最大斯密斯数之间的质数,时间复杂度的为O(1e9),勉强能过,空间复杂度为bool[1e9],又因为这个区间质数最多为5762455(小函数提前计算),则再加上int[5762455],勉强还有点空间
  2. 从n+1开始寻找合数且为"史密斯数",即为斯密斯数.

  代码

#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#define FORa(i,s,e) for(int i=s;i<=e;i++)
#define FORs(i,s,e) for(int i=s;i>=e;i--)
#define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,10000,stdin),pa==pb)?EOF:*pa++
#define File(name) freopen(name".in","r",stdin),freopen(name".out","w",stdout)using namespace std;
static char buf[10000],*pa=buf,*pb=buf;
inline int read();const int N1=100000000,N2=5762455;
int n,cnt,prime[N2+1];
bool bz[N1+1];
void Oulashai(int fn)
{FORa(i,2,fn){if(!bz[i]) prime[++cnt]=i;FORa(j,1,cnt){if(i*prime[j]>fn) break;         bz[i*prime[j]]=true;if(i%prime[j]==0) break;}}
}
int Back(int x)
{int ct=0;while(x) ct=ct+x%10,x/=10;return ct;
}
bool Check(int x)
{int fx=x,cnt1=0,cnt2=Back(x);FORa(i,2,sqrt(fx)) {int ct=0,backi=Back(i);if(fx%i==0){while(fx%i==0){fx/=i,ct++;    if(cnt1+ct*backi>cnt2) return 0;} cnt1=cnt1+ct*backi;        }}if(fx>1) cnt1+=Back(fx);return cnt1==cnt2;
}
int main()
{File("smith");n=read(),Oulashai(n+2000);int p=n;while(1){++p;if(bz[p]&&Check(p)) {printf("%d",p);exit(0);}}return 0;
}
inline int read()
{register int x(0);register int f(1);register char c(gc);while(c<'0'||c>'9') f=c=='-'?-1:1,c=gc;while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc;return x*f;
}

总结:

  1.    Handsome guy and beaty,读题真的very important!
  2. 学会正确分析时空复杂度1B=1字节哦!

转载于:https://www.cnblogs.com/SeanOcean/p/11158982.html

2019.7.9 校内测试题 史密斯数相关推荐

  1. 2019.7.8 校内测试题 连续数和

    题目 连续数和 (num.cpp,1s,128MB) [问题描述]: 一个正整数有可能可以被表示为 n(10^9>=n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5 ...

  2. 2019.7.8 校内测试题 能量球

    题目 能量球(enb.cpp,1s,128MB) [问题描述]: sideman 有着一个你们所不知道的秘密.实际上,sideman 不是地球人,而 是遥远的 Gliese 行星的生物.sideman ...

  3. 2019.7.8 校内测试题 计数

    题目 计数(getCount.cpp,1s,128MB) [问题描述]: 对于一个整数 b,若存在整数 a 使 b=a*a,且 a>1,那末我们称 b 是"平方数": 对于一 ...

  4. 2019.7.7 校内测试题 尴尬的密码员

    题目 尴尬的密码员(crypto.cpp,128MB,1s) [问题描述]: 年轻有为的密码员小 Y 已经成功为他现在的公司中一个拥有成千上万用户 的大系统设计了一套加密模块.这个加密模块的密码是由两 ...

  5. 2019.7.9 校内测试题 数学问题

    题目 数学问题(math.cpp,1s,128MB) [问题描述]: 在一个渺无人烟的荒岛上待了 xx 年之后,小 Y 基本上啥都不会了.所以当小 Z 告诉他任何一个大于等于 4 的偶数都能表示成两个 ...

  6. 2019广西对口计算机分数线,2019广西本科第一批投档分数线出炉,网友:我差一点考上清华大学...

    2019广西本科第一批投档分数线出炉,网友:我差一点考上清华大学-- 就在昨天,7月13号,广西招生考试院公布了"2019年普通高校招生本科第一批最低投档分数线".不知道,参加第一 ...

  7. 夏季室内甲醛净化 A.O.史密斯数显甲醛净化器让用户更放心

    南京2018年8月8日电 /美通社/ -- 在雾霾肆虐的日子里,使用空气净化器来净化室内空气已经成了大家的共识.事实上,除了爆表的PM2.5,我们每个人(包括一家老小)还面临着室内甲醛.细菌病毒等多重 ...

  8. Smith(史密斯)数的求法

    先看一下来自百度百科的关于史密斯数的介绍: 美国有一位数字家名叫阿尔伯特·威兰斯基,他姐夫史密斯非常喜欢研究数学,所以两人经常在一起研讨各种数学问题.有时,两人碰不到一起,就习惯性地用电话交流. 一天 ...

  9. 【LEETCODE】【史密斯数】

    [LEETCODE][史密斯数] 题目描述 Simth数的概念:一个非素数,其各位之和等于其所有质因数的各位之和.例如: 4=2 2,4=2+2,所以4是一个史密斯数. 22=211,2+2=2+1+ ...

最新文章

  1. VCL标准化皮肤组件Alphacontrols发布v10.27
  2. python可以做什么系统-python能做哪方面的工作
  3. 数据结构32:树存储结构
  4. NPAPI和PPAPI开发
  5. Autofac的切面编程实现
  6. HDU - 6621 K-th Closest Distance——主席树+二分
  7. BZOJ1423 : Optimus Prime
  8. 机器学习(6): 层次聚类 hierarchical clustering
  9. 插入排序——3希尔排序实现
  10. 在线mod计算机,计算机系中有关mod的常识(全).doc
  11. 通过分区(Partition)提升MySQL性能
  12. 编译OpenJDK12:LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
  13. c++EasyX极乐净土的实现及音乐头文件的使用
  14. 网络连接状态断开服务器无响应,解决SSH自动断线,无响应的问题。
  15. ArcGIS:如何对要素类进行查询要素属性、更改符号、标记?
  16. [渝粤教育] 西南科技大学 管理学原理 在线考试复习资料(6)
  17. SQL进阶篇之约束(Constraints)
  18. 霍夫曼编码代码matlab,matlab 实现霍夫曼编码
  19. 怎么才能使用计算机,电脑可以上微信吗,详细教您电脑怎么用微信
  20. 中国超级计算机gpu,英伟达(NVIDIA)Tesla GPU为全球最快的超级计算机提供动力支持...

热门文章

  1. Python应用matplotlib绘图简介
  2. jquery日历插件 途牛_jquery日历插件SimpleCalendar
  3. 脚本修改linux网络配置,用脚本实现Linux的网络配置
  4. php 分页参数丢失,THINKPHP3.2搜索分页丢失参数,实现保留搜索条件解决办法
  5. async await异步发送请求例子
  6. 什么是网络推广浅析如何提高搜索引擎的抓取频次?
  7. 湖南网络推广中网络SEO竞争越来越激烈,怎么才能实现“弯道超车”呢?
  8. 杰奇数据库mysql_杰奇模板出现Unable to save result set in…可尝试修复数据库
  9. python自动化教程_Python自动化开发实战视频课程-全新基础篇_Python教程
  10. rbac权限管理 php,thinkPHP3.2使用RBAC实现权限管理的实现