2024蓝桥杯JavaB组第二题

思路:

这一题首先要知道求和符号,就是说看一个数,将这个数按其字符长度分成一个数组

例如12345这个数会分成:1,2,3,4,5这个数组,然后分成这个数组为初始数组,通过初始数组进行类斐波那契数列运算,初始数组有几位,每次新的数就有连续的几位相加。一直这样算,看是否能生成新数时有与原数相同,如果相同,就是类斐波那契数。

这一题要问最大的斐波那契数是多少,所以要从大往小进行判断,要看每一个数是不是符合条件的数:

        int a=(int)1e7;
		while(a>0) {
//从后往前来看,判断每一个数,如果符合则找到这个数,否则--到进行下一个值的判断	
//fib方法由于判断这个数是否符合,返回值是Boolean型
			if(fib(a)) {
				System.out.println(a);
				break;
			}else {
				a--;
			}
		}
   

再进行判断是否符合前,要对这个数进行处理

static List<Integer> li(int a){		
//将这个数的每一位拆分,放进一个集合中,list集合允许有重复的值,且可以进行集合长度的改变
		List<Integer> li1=new ArrayList<>();			
		while(a>0) {	//小于10的数%10得0		
			int b=a%10;//b为拆分后最后的一个数
			li1.add(b);
			a=a/10;
		}
		Collections.reverse(li1);//进行反转,使得数组顺序正常
		return li1;
	}

最后进行判断:

static boolean fib(int a) {		
        //获取进行整理后的集合
		ArrayList<Integer> list=new ArrayList<>(li(a));
		int n=list.size();//n是动态的,随着增添而变大
		int k=li(a).size();
		while(true) {
			//int n=li(a).size();
			int sum=0;
            //模拟一个滑动数组,用到了n会变化的特点
			for(int i=list.size()-1;i>list.size()-1-k;i--) {
				sum+=list.get(i);		
			}	
			
			if(sum==a) {//如果存在返回true,在main方法中对应的进行返回得到的最大的符合目标值
				return true;
			}
			if(sum>a) {
				return false;//否则返回false,在main方法中对应的进行a--
			}list.add(sum);//进行添加
		}
	}

 整体代码:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class 第二题 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a=(int)1e7;
		while(a>0) {
//			从后往前来看,判断每一个数,如果符合则找到这个数,否则--到进行下一个值的判断	
			if(fib(a)) {
				System.out.println(a);
				break;
			}else {
				a--;
			}
		}
	}
	static boolean fib(int a) {		
		ArrayList<Integer> list=new ArrayList<>(li(a));
		int n=list.size();
		int k=li(a).size();
		while(true) {
			//int n=li(a).size();
			int sum=0;
			for(int i=list.size()-1;i>list.size()-1-k;i--) {
				sum+=list.get(i);		
			}	
			
			if(sum==a) {
				return true;
			}
			if(sum>a) {
				return false;
			}list.add(sum);
		}
	}
	static List<Integer> li(int a){		
		List<Integer> li1=new ArrayList<>();			
		while(a>0) {			
			int b=a%10;
			li1.add(b);
			a=a/10;
		}
		Collections.reverse(li1);
		return li1;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值