算法和斐波那契数列
2013-12-02 11:09
141 查看
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
此两例考察是的是算法。从第一个例子来看,从1开始报数,报到14的这个人就要退出。那么每次退出的人都是偶数,然后其他人重新开始,从1报数,到14退出。那么我们可以想象一下退出的一次为:14、28、42等。
思路:首先,定义一个数组
其次,给函数赋值,并传参,再调用
判断这个人的唯一性。
package com.itheima;
import java.util.Arrays;
public class Test10 {
/**
* 10、 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,
* 从1报数,到14退出。问:最后剩下的是100人中的第几个人?
* @param args
*/
public static int count=0;//出局的人
public static void main(String[] args) {
// TODO Auto-generated method stub
int sum=100;
int exit=14;
sumExit(sum,exit);//调用判断方法
}
public static void sumExit(int sum,int exit)
{
int[] arr=new int[sum];//创建数组长度为sum
for(int i=0;i<sum;i++)//双重循环
{
for(int j=0;j<exit;j++)
{
count++;//每数一个人,自增
if (j>0)
have(i,arr);//调用是否存在的方法
if(count>sum)
{
count=1;//重新赋值,因为count大于总人数
have(i,arr);
}
}
arr[i]=count;//退出的人
}
System.out.println("退出的顺序为:"+Arrays.toString(arr));
System.out.println("最后剩下的人为:"+arr[sum-1]);
}
public static void have(int n,int[] arr)
{
for(int x=0;x<n;x++){
for(int y=0;y<n;y++)
{
if (count==arr[y])
count++;//判断是否唯一,存在就加一
}
}
}
}
package com.itheima;
import java.util.Scanner;
求斐波那契数列
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
这个数列从第三项开始,每一项都等于前两项之和。
public class Test3 {
/**
* 3、求斐波那契数列第n项,n<30斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55
* @param args
*/
//本题采用递归的方法,求出第N项的值
public static void main(String[] args) {
// TODO Auto-generated method stub
int n;
for (int i=1;i<=10;i++)
{
n=PBN(i);//采用递归
System.out.print(n+"-");//输出前十项
}
System.out.print("请输入N:");
Scanner in=new Scanner(System.in);//输入你想获得那一项的值
n=in.nextInt();
System.out.print("值为:"+PBN(n));
}
public static int PBN(int x)
{
if(x<=1)
return x;//如果值为1,则返回1
else
return PBN(x-1)+PBN(x-2);
}
}
兔子数列:兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对
两个月后,生下一对小兔对数共有两对
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对
------
依次类推可以列出下表:
幼仔对数=前月成兔对数
成兔对数=前月成兔对数+前月幼仔对数
总体对数=本月成兔对数+本月幼仔对数
可以看出幼仔对数、成兔对数、总体对数都构成了一个数列。这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。
除了具有a(n+2)=an+a(n+1)的性质外,还可以证明通项公式为:an=(1/√5)*{[(1+√5)/2]^n-[(1-√5)/2]^n}(n=1,2,3.....)
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
此两例考察是的是算法。从第一个例子来看,从1开始报数,报到14的这个人就要退出。那么每次退出的人都是偶数,然后其他人重新开始,从1报数,到14退出。那么我们可以想象一下退出的一次为:14、28、42等。
思路:首先,定义一个数组
其次,给函数赋值,并传参,再调用
判断这个人的唯一性。
package com.itheima;
import java.util.Arrays;
public class Test10 {
/**
* 10、 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,
* 从1报数,到14退出。问:最后剩下的是100人中的第几个人?
* @param args
*/
public static int count=0;//出局的人
public static void main(String[] args) {
// TODO Auto-generated method stub
int sum=100;
int exit=14;
sumExit(sum,exit);//调用判断方法
}
public static void sumExit(int sum,int exit)
{
int[] arr=new int[sum];//创建数组长度为sum
for(int i=0;i<sum;i++)//双重循环
{
for(int j=0;j<exit;j++)
{
count++;//每数一个人,自增
if (j>0)
have(i,arr);//调用是否存在的方法
if(count>sum)
{
count=1;//重新赋值,因为count大于总人数
have(i,arr);
}
}
arr[i]=count;//退出的人
}
System.out.println("退出的顺序为:"+Arrays.toString(arr));
System.out.println("最后剩下的人为:"+arr[sum-1]);
}
public static void have(int n,int[] arr)
{
for(int x=0;x<n;x++){
for(int y=0;y<n;y++)
{
if (count==arr[y])
count++;//判断是否唯一,存在就加一
}
}
}
}
package com.itheima;
import java.util.Scanner;
求斐波那契数列
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
这个数列从第三项开始,每一项都等于前两项之和。
public class Test3 {
/**
* 3、求斐波那契数列第n项,n<30斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55
* @param args
*/
//本题采用递归的方法,求出第N项的值
public static void main(String[] args) {
// TODO Auto-generated method stub
int n;
for (int i=1;i<=10;i++)
{
n=PBN(i);//采用递归
System.out.print(n+"-");//输出前十项
}
System.out.print("请输入N:");
Scanner in=new Scanner(System.in);//输入你想获得那一项的值
n=in.nextInt();
System.out.print("值为:"+PBN(n));
}
public static int PBN(int x)
{
if(x<=1)
return x;//如果值为1,则返回1
else
return PBN(x-1)+PBN(x-2);
}
}
兔子数列:兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对
两个月后,生下一对小兔对数共有两对
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对
------
依次类推可以列出下表:
经过月数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
幼仔对数 | 1 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 |
成兔对数 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 |
总体对数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 | 233 |
成兔对数=前月成兔对数+前月幼仔对数
总体对数=本月成兔对数+本月幼仔对数
可以看出幼仔对数、成兔对数、总体对数都构成了一个数列。这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。
除了具有a(n+2)=an+a(n+1)的性质外,还可以证明通项公式为:an=(1/√5)*{[(1+√5)/2]^n-[(1-√5)/2]^n}(n=1,2,3.....)
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
相关文章推荐
- 斐波那契数列的算法优化
- 斐波那契数列三种算法(fibonacci)
- 【转】斐波那契数列算法分析
- 关于斐波那契数列算法设计问题 --漫漫算法路 小结篇
- 【算法】斐波那契数列的效率问题
- [剑指offer]算法7 斐波那契数列
- 算法复习:斐波那契数列
- 利用移位算法求前40位的斐波那契数列
- 斐波那契数列算法及时间复杂度分析
- 【算法】斐波那契数列--C++源代码(VS2015)
- 基础算法题----兔子问题(斐波那契数列)
- 算法-汉诺塔&斐波那契数列求和
- 求斐波那契数列O(logn算法)
- 【每天学点算法题10.16】斐波那契数列问题
- 算法 斐波那契数列的递归
- 算法之斐波那契数列(Fabonacci)
- 用两个栈实现队列、旋转数组的最小数、斐波那契数列、青蛙跳台阶、矩形覆盖 --漫漫算法路 刷题篇
- C语言之基本算法06—斐波那契数列求和
- 从零开始学swift(三)-算法之斐波那契数列
- Java基础算法——斐波那契数列的多种实现方式!