数的计数——递推算法

Problem Description

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

不作任何处理;

在它的左边加上一个自然数,但该自然数不能超过原数的一半;

加上数后,继续按此规则进行处理,直到不能再加自然数为止。

Input

输入有多组数据,每组数据为自然数n。

Output

对于每组数据输出满足条件的数的个数。

Sample Input

6

Sample Output

6

Hint
满足条件的数为6,16,26,126,36,136。

Author

HYNU

代码:

//递推公式:当i为奇数时,h(i)=h(i-1);当i为偶数时,h(i)=h(i-1)+h(i/2).
#include<stdio.h>
int h[1001];
int fun(int n)
{
   int i;
   h[1]=1;
   for(i=2;i<=n;i++)
     {
        if(i%2==1)h[i]=h[i-1];
        else h[i]=h[i-1]+h[i/2];
     }
   return h[n];
}
int main()
{
   int n;
   while(scanf("%d",&n)!=EOF)
   {
      printf("%d\n",fun(n));
   }
   return 0;
}

数的计数——递推算法,布布扣,bubuko.com

时间: 2024-10-13 21:50:52

数的计数——递推算法的相关文章

Yue Fei&#39;s Battle(组合计数递推)

//求一个直径为 k 的树有多少种形态,每个点的度不超过 3 // 非常完美的分析,学到了,就是要细细推,并且写的时候要细心 还有除法取模需要用逆元 #include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> using namespace std; #define MOD 1000000007 #define L

斐波那契 递推算法

/***Date : 2014.12.10***/ //递推算法:是理性思维模式的代表,根据已有的数据和关系,逐步推导而得出结果. //执行过程:1)根据已知的结果和关系,求解中间结果. ///////////////////// 2)判断是否满足要求,若未满足,则继续根据已知结果和关系求解中间结果:若满足要求,则表示寻找到一个正确答案. //13世纪,意大利数学家斐波那契的<算盘书>中记载:兔子产仔问题. //一对两个月大的兔子,每月都可产仔一对,小兔子两月后的每月也可产仔一对;即1月生,3

数据结构与算法之递推算法 C++与PHP实现

数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的.往往是在发展一种算法的时候,构建了适合于这种算法的数据结构.一种数据结构如果脱离了算法,也就没有存在的价值了. 算法的作用----解决任何一个实际问题,都不可避免地涉及到算法的问题,通过一定的算法,得到一个最优(或较优)的方案. 递推算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法. 顺推法:从已知条件出发,逐步推算出要解决的问题的方法. 逆推法:从已知问题的结果出发,用迭代表达式逐步推算

组合数递推算法

主要式子:C(n,k)=C(n-1,k-1)+C(n-1,k),C(n,k)表示从n个物品中挑选k个物品的所有组合数. 1 #include<stdio.h> 2 #include<string.h> 3 #define N 10 4 int c[N][N]; 5 void init() 6 { 7 memset(c,0,sizeof(c)); 8 for(int i=0;i<=N;i++) 9 { 10 c[i][0]=1; 11 c[i][i]=1; 12 for(int

c语言递推算法1

递推算法之一:倒推法 1.一般分析思路: if 求解初始条件F1 then begin { 倒推 } 由题意(或递推关系)确定最终结果Fn; 求出倒推关系式Fi-1 =G(Fi ); i=n; { 从最终结果Fn出发进行倒推 } while 当前结果Fi非初始值F1 do 由Fi-1=G(Fi)倒推前项; 输出倒推结果F1和倒推过程; end { of then } else begin { 顺推 } 由题意(或递推关系)确定初始值F1(边界条件); 求出顺推关系式Fi=G(Fi-1); i=1

LA 4123 (计数 递推) Glenbow Museum

题意: 这种所有边都是垂直或水平的多边形,可以用一个字符串来表示,一个270°的内角记作O,一个90°的内角记作R. 如果多边形内存在一个点,能看到该多边形所有的点,则这个多边形对应的序列是合法的.这里长度不作限制,只要长度适当能满足要求即可. 现给出序列长度,问有多少种序列符合要求. 分析: 书上分析地很清楚,罗列一下要点: 首先对于一个长度为n的合法序列,R的个数为(n+4)/2,O的个数为(n-4)/2,即R比O多4个 我们要找的序列满足要求:R比O多4个,没有两个O相邻. 这里先设计了一

递推算法

递推算法 一.递推算法简介 一般是两步: 1.根据题目条件推出递推公式 2.根据递推公式编写代码求解(一般可以写成普通循环和递归) 二.实例 2.1 斐波拉契数列 斐波拉契数列,1 1 2 3 5 8 13 21 34......,写出第n项. (1)递推公式 f(n)=f(n-1)+f(n-2) f(1)=1,f(2)=1; (2)代码 1 #include <iostream> 2 using namespace std; 3 4 int Fibonacci(int n); 5 int F

[bzoj1002][FJOI2007 轮状病毒] (生成树计数+递推+高精度)

Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不同的3轮状病毒,如下图所示 现给定n(N<=100),编程计算有多少个不同的n轮状病毒 Input 第一行有1个正整数n Output 计算出的不同的n轮状病毒数输出 Sample Input

1.2递推算法

1 生兔子问题 1 #include <stdio.h> 2 #define NUM 13 3 int main() 4 { 5 int i; 6 long fib[NUM] = {1,1}; 7 8 for(i=2;i<NUM;i++) 9 { 10 fib[i] = fib[i-1]+fib[i-2]; 11 } 12 for(i=0;i<NUM;i++) 13 { 14 printf("%d月兔子总数:%d\n", i, fib[i]); 15 } 16