P1028 数的计算Java版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/83745624

题目来自:https://www.luogu.org/problemnew/show/P1028

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

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

不作任何处理;

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

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

输入输出格式
输入格式:
11个自然数nn(n \le 1000n≤1000)

输出格式:
11个整数,表示具有该性质数的个数。

输入输出样例
输入样例#1:
6
输出样例#1:
6

说明
满足条件的数为
6,16,26,126,36,136


这是一道递归与递推的题目。
先说一下什么是递归,递归就是程序调用自身的编程技巧称为递归。意思就是抽象出一个通项公式,大问题分解成一个小问题。
这道题我用递归,发现容易爆内存,因为时间复杂度太复杂了。。。题目要求1000内,这个时候递归显然是不行的。然后换了个递推就行了。
有人会问什么是递推,其实和递归类似,都是先得到通项公式,只不过他的时间复杂度远远小于递归。
我们首先设置一个数组kind,来存储个数,下标是需要求的数
先考虑几个例子,kind[0]=1,kind[1]=1,kind[2]=kind[1]+1,kind[3]=kind[1]+1,kind[4]=kind[2]+kind[1]+1;
可以得出通向式子,值为k的数的结果个数=值不大于k的半的所有结果个数+本身的1.
所以直接撸代码:

import java.util.*;

public class Main {
   public static void main(String args[]) {
       int num;
       int[] kind = new int[1002];
       Scanner scanner = new Scanner(System.in);
       num = scanner.nextInt();
       for (int i = 0; i <= num; i++) {
           kind[i] = 1;
       }
       for (int i = 2; i <= num; i++) {
           for (int j = 1; j <= i / 2; j++) {
               kind[i] += kind[j];
           }
       }
       System.out.print(kind[num]);
       return;
   }
}

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/83745624
今日推荐