zoukankan      html  css  js  c++  java
  • 洛谷P1028 数的计算

    题目描述

    我们要求找出具有下列性质数的个数(包含输入的自然数nnn):

    先输入一个自然数nnn(n≤1000n le 1000n1000),然后对此自然数按照如下方法进行处理:

    1. 不作任何处理;

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

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

    输入格式

    111个自然数nnn(n≤1000n le 1000n1000)

    输出格式

    111个整数,表示具有该性质数的个数。

    输入输出样例

    输入
    6
    
    输出
    6
    

    说明/提示

    满足条件的数为

    6,16,26,126,36,136

    这题用简单递推就可以做出来了(找规律)

    /*
    递推法
    举个例n=12
    每一轮大循环打印一次数组的结果如下(循环了11次,为1时答案唯一直接存了):
    0 1 2 0 0 0 0 0 0 0 0 0 0
    0 1 2 2 0 0 0 0 0 0 0 0 0
    0 1 2 2 4 0 0 0 0 0 0 0 0
    0 1 2 2 4 4 0 0 0 0 0 0 0
    0 1 2 2 4 4 6 0 0 0 0 0 0
    0 1 2 2 4 4 6 6 0 0 0 0 0
    0 1 2 2 4 4 6 6 10 0 0 0 0
    0 1 2 2 4 4 6 6 10 10 0 0 0
    0 1 2 2 4 4 6 6 10 10 14 0 0
    0 1 2 2 4 4 6 6 10 10 14 14 0
    0 1 2 2 4 4 6 6 10 10 14 14 20
    12/2=6
    12的左边可以为1 2 3 4 5中的数,所以f[12]=f[1]+f[2]+f[3]+f[4]+f[5]+f[6]+1(这个1是加上本身)
    既f[12]=1+2+2+4+4+6+1=20
    所以得到递推公式
    f[n]=f[1]+f[2]+.....+f[n/2]+1;
    */
    #include<stdio.h>
    #include<iostream>
    using namespace std;
    int f[1001]= {0,1};
    void solve(int n)
    {
        
        for(int i=2; i<=n; i++)
        {
            for(int j=1; j<=i/2; j++)
                f[i]+=f[j];
            
            f[i]++;
        }
    }
    int main()
    {
        int n;
        cin>>n;
        solve(n);
        cout<<f[n]<<endl;
        return 0;
    }
  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/tp25959/p/11408674.html
Copyright © 2011-2022 走看看