快捷搜索: 王者荣耀 脱发

与斐波那契数列相关的算法题

好好学习,天天向上!

1.问题描述

1.Description 有一个斐波那契序列f[1],f[2],…和两个整数a,b。其中f[k]表示Fibonacci序列中第k个元素,求解f[a]+f[a+1]+…+f[b]是偶数还是奇数。 Fibonacci序列: 公式: 举例: f[1]=1,f[2]=1,f[3]=2,f[4]=3,f[5]=5,f[6]=8,… 2.Input 有多个测试用例。输入的第一行包含一个整数T(大约100),表示测试用例的数量。 对每个测试用例:第一行也是唯一一行包含两个整数a和b (1<a<=b<1010000)。 3.Output 对于每个测试用例输出一行,如果是 偶数输出为0,如果是奇数输出为1。 4.测试用例 输入 输出 输入测试用例个数 6 用例1 1,2 0 用例2 2,3 0 用例3 1,4 1 用例4 1,5 0 用例5 123456 ,234567897654321 0 用例6 123,201990427201904272019042720190427 1

2.问题分析

  1. 先让我们看看斐波那契数列有什么奇偶规律。细心观察发现从起开始,每三个斐波那契数列的元素呈现:奇数(1)、奇数(1)、偶数(0)的现象。(我们可以把每三个斐波那契序列元素作为一个整体)
  2. 其次,注意由于计算机的整数类型无法承载1010000的数,所以要考虑如何存储输入变量的问题。
  3. 再然后,我们需要把f[a]+f[a+1]+…+f[b]进行分析,决定该公式的主要两个因素是a和b分别mod3得到的位置。把a和b所得位置与整体相加的奇偶进行优化确定,具体分析视图:
  4. 最后,将a所得的奇偶数与b所得的奇偶数相加可得出最终结果。

3.上代码:

import java.util.Scanner;


public class AboutFibonacci {
          
   
	//通过字符串的方式处理数组 获取所输值得到的位置
	public static int simpleNumber(String s) {
          
   
		int res=0;
		for(int i=0;i<s.length();i++) {
          
   
			res+=(int)s.charAt(i);
		}
		res=res%3;
		return res;
	}
	public static int outPut(String a,String b) {
          
   
		  int sa = 0;//a每个位的数的总和
		  int sb = 0;
		  int ta=0;
		  int tb=0;
		  sa=simpleNumber(a);
		  sb=simpleNumber(b);
		  //根据a的位置给予奇偶数
		  if(sa==2) {
          
   
			  ta=1;
		  }else {
          
   
			  ta=0;
		  }
		  //根据b的位置给予奇偶数
		  if(sb==1) {
          
   
			  tb=1;
		  }else {
          
   
			  tb=0;
		  }
		  //通过异或运算得到最后的结果
		  return ta^tb;
		 }
	
		 public static void main(String[] args) {
          
   
		  Scanner scan = new Scanner(System.in);
		  //输入多少个测试用例
		  int num = scan.nextInt();
		  for(int i = 1;i <= num;i++) {
          
   
		   String s1 = scan.next();
		   String s2=scan.next();
		   System.out.println(outPut(s1,s2));
		  }
		 } 
}

5.总结

学习算法题时,可以考虑自己先分析分析,然后多动手,很多问题是你动手的时候出现的。还是希望大家一起努力学习进步!

经验分享 程序员 微信小程序 职场和发展