
思路:
这一题首先要知道求和符号,就是说看一个数,将这个数按其字符长度分成一个数组
例如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;
}
}
533

被折叠的 条评论
为什么被折叠?



