P1028 [NOIP2001 普及组] 数的计算

Java代码:

java 复制代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int num= sc.nextInt();
        int arr[]=new int[1001];
        for (int i = 0; i < arr.length; i++) {
            arr[i]=0;
        }
        System.out.println(fa(num,arr));
    }
    public static int fa(int num,int arr[]){
        if(num==1) return 1;
        else {
            int sum=0;
            for (int i = 1; i <= num/2; i++) {
                //如果存在
                if(arr[i]!=0)
                sum+=arr[i];
                //如果不存在
                if (arr[i]==0)
                sum+=fa(i,arr);
            }
            //如果不存在就变成存在
            if(arr[num]==0)
            arr[num]=sum+1;
            return sum+1;
        }
    }
}

下面是若干次失败的尝试:

java 复制代码
import java.util.Scanner;

public class Main {
    static int n=0;
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int num=sc.nextInt();
        fa(num);
        System.out.println(n);
    }
    public static void fa(int num){
        n++;
        if(num==1) return;
        for (int i = 1; i <= num/2; i++) {
            fa(i);
        }
    }
}
java 复制代码
import java.util.Scanner;

public class Main {
    static int n=0;
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int num=sc.nextInt();
        int arr[]=new int[num/2+1];
        for (int i = 0; i < arr.length; i++) {
            arr[i]=0;
        }
        fa(num,arr);
        System.out.println(n);
    }
    public static void fa(int num,int arr[]){
        //已知的话不必n++,逐个向下了
        //也就是进入到已知就直接用已知的数
        //arr[num]是已知的
        //比如arr[4]就是4的所有向下的点的个数,包括四自己
        if(num<arr.length&&arr[num]!=0){
            n+=arr[num];
            return;//不必向下了
        }


        //下面是未知的部分
        //就需要我们把未知的变成已知的
        //计算就不那么繁琐了

            n++;
            if(num==1) return;
            for (int i = 1; i <= num/2; i++) {
                fa(i,arr);
                if(arr[i]!=0){
                    arr[i]=n;
                }
            }

    }
}
java 复制代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int num= sc.nextInt();
        System.out.println(fa(num));
    }
    public static int fa(int num){
        if(num==1) return 1;
        else {
            int sum=0;
            for (int i = 1; i <= num/2; i++) {
                sum+=fa(i);
            }
            return sum+1;
        }
    }
}
相关推荐
董董灿是个攻城狮7 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
怒放吧德德9 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆11 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌13 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊14 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang14 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
AI软著研究员14 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish15 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Ray Liang16 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
颜酱16 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法