数的计算(数的计数)

题目描述

我们要求找出具有下列性质数的个数(包含输入的自然数n)。先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:

  1. 不作任何处理;
  2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;
  3. 加上数后,在新加上数的左边继续按此规则进行处理,直到不能再加自然数为止.

例如:

输入:  6
满足条件的数为 6 (此部分不必输出)
16
26
126
36
136
输出: 6

输入

只有一行一个整数,为自然数n(n<=1000)

输出

输出满足条件数的个数

样例输入

6

样例输出

6

分析

  • 手动按照上述过程进行计算,会发现这是个递归的过程,对每一个原始数字m,在前面加i(1,2,3,...m/2),即h(n)=1+h(1)+f(2)+...+h(n/2),对于每一个i,要按照同样的规则进行,这用递归可以实现(见例程1),递归过程中,每遇到一个原始数,计数器加1,用来统计个数。

  • 例程1在OJ中会显示超时,这是必然的,当n很大时,递归的过程就会很长,这主要源于其中会做大量的重复计算,每次计算h(n),都要重复计算h(1)....h(n/2),这样的问题在使用递归计算斐波那契数f(n)时,也会遇到,程序效率很低。解决的一个途径是使程序具有记忆功能,已计算出的数字就无需再次计算,直接使用即可。例程2使用数组实现了带记忆功能的递归,可以通过OJ系统。

  • 也可以使用递推的方法来解决问题:已知h(n)=1+h(1)+h(2)+...+h(n/2),这就是一个递归式,程序写起来很容易(见例程3),两层for循环就可完成,递推比起无记忆的递归来效率要高得多。例程1是指数级的时间复杂度,而例程3的时间复杂度为O(n2)

  • 问题可以进一步简化。通过对上面的公式进行推导可以发现:n为奇数时,h(n)=h(n-1),n为偶数时,h(n)=h(n-1)+h(n/2),看懂了吗,使用这两个公式,可以将时间复杂度降低到O(n),见例程4。

例程1

#include<iostream>
using namespace std;
int ans; //计数器
void dfs(int m){
ans++; //每出现一次原始数,ans++
for(int i=1; i<=m/2; i++){
dfs(i); //递归
}
}
int main(){
int n;
cin>>n;
dfs(n);
cout<<ans;
return 0;
}

例程2

#include<iostream>
using namespace std;
int h[1001]; //记忆数组,存储计算出的h[m]
void dfs(int m){
if(h[m]!=0) return; //有记忆,不再递归
h[m]=1; //无记忆,初始化为1,递归累加计算
for(int i=1; i<=m/2; i++){
dfs(i); //递归
h[m]+=h[i]; //累加
}
}
int main(){
int n;
cin>>n;
dfs(n);
cout<<h[n];
return 0;
}

例程3

#include<iostream>
using namespace std;
int h[1001];
int main(){
int n;
cin>>n;
h[1]=1; //初始化第一项h[1]
for(int s=2;s<=n;s++){ //对第s项
h[s]=1; //数字s自己算一个
for(int i=1;i<=s/2;i++) h[s]+=h[i];
}
cout<<h[n];
return 0;
}

例程4

#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
h[1]=1; //初始化第一项
for(int i=2; i<=n; i++){
h[i]=h[i-1]; //递推
if(i%2==0) h[i]+=h[i/2]; //i为偶数时
}
cout<<h[n];
return 0;
}

最新文章

  1. HackerRank &quot;Kruskal (MST): Really Special Subtree&quot;
  2. Android之activity初讲
  3. 喜大普奔!Fanvas正式对外开源了,一键把Flash转为Canvas动画!移动终端动画开发不再困难。
  4. XAML(3) - 附带属性
  5. ASP.NET 4的Demo实践:URL路由改进支持
  6. Android:布局合集
  7. js 常用正则表达式(不断维护中)
  8. Java模拟post提交表单数据
  9. 《JAVA与模式》之门面模式
  10. 推荐使用国内的豆瓣源安装Python插件
  11. 深谈auto变量
  12. 如何在一个项目中同时包含mvc建站、webapi接口
  13. java数据结构和算法02(栈)
  14. kubenetes_V1.14.0 安装部署
  15. 一个磁盘I/O故障导致的AlwaysOn FailOver 过程梳理和分析
  16. MyLog
  17. Java中instanceof与getClass的区别
  18. linux下 彻底修改python的包/模块导入路径
  19. 『TensorFlow Internals』笔记_系统架构
  20. CMOS集成门电路

热门文章

  1. Java之IO流进阶篇:内存流,打印流,对象流
  2. 【Linux基础】查看硬件信息-CPU
  3. springMVC框架核心方法调用源码解析
  4. JavaScript代码组织结构良好的5个特点
  5. pytorch实现性别检测
  6. Mac下MySql初始密码设置及mysql数据库操作
  7. [看图说话]在VMware Workstation 9中安装Mac OS X 10.8 Mountain Lion
  8. BZOJ1000-1099板刷计划+一句话题解 73/100
  9. C# GDI+绘制一维条码打印模糊的解决办法
  10. Git和Gitlab在使用过程中所遇到的问题