斐波那契

实验七

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-04 16:19:06
20182334 2019-2020-1 《数据结构与面向对象程序设计》实验七报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 姬旭 学号: 20182334 实验教师:王志强 实验日期:2019年10月31日 必修/选修: 必修 1.实验内容 实验七-查找与排序-1 定义一个Searching和Sorting类,并在类中实现linearSearch,SelectionSort方法,最后完成测试。 要求不少于10个测试用例,提交测试用例设计情况(正常,异常,边界,正序,逆序),用例数据中要包含自己学号的后四位 提交运行结果图。 实验七-查找与排序-2 重构你的代码 把Sorting.java Searching.java放入 cn.edu.besti.cs1823.(姓名首字母+四位学号) 包中(例如:cn.edu.besti.cs1823.G2301) 把测试代码放test包中 重新编译,运行代码,提交编译,运行的截图(IDEA,命令行两种) 实验七-查找与排序-3 参考http://www.cnblogs.com/maybe2030/p/4715035.html ,学习各种查找算法并在Searching中补充查找算法并测试 提交运行结果截图 实验七-查找与排序-4 补充实现课上讲过的排序方法:希尔排序,堆排序,二叉树排序等(至少3个) 测试实现的算法(正常,异常

深入理解递归算法之斐波那契数列(兔子数列)

你。 提交于 2019-12-04 11:54:04
问题描述: 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*) 找到递归的递推公式后,使用代码是实现就比较好理解了 import java.util.*; public class Rabbit { public static void main(String[] args){ System.out.println("请输入一个整数来表示你希望计算的月份:"); Scanner scan= new Scanner(System.in); int i=scan.nextInt(); int s=calc(i); System.out.printf("%d个月份后兔子的数量为:%d",i,s); } public static int calc(int n){ if(n==1||n==2){ return 1; } else{ return calc(n-1)+calc(n-2); } } } 二:使用递归的思想实现计算一个数字的阶乘 import

欧拉工程第一至十题解题思路分析

不打扰是莪最后的温柔 提交于 2019-12-03 23:08:52
一、3或5的倍数(multiples of 3 and 5) 如果我们将小于10的所有是3或5倍数的自然数列出来,我们得到3,5,6和9,它们的和是23。与之类似,计算1000以下所有是3或5的倍数的自然数的和。 分析:此题至少有两种解法,第一种解法较为直接,将1000以下所有3或5的倍数列出再求即可,在python中使用列表推导式只需要一行代码即可。第二种思路是使用求和公式,分别求出1000以下所有三的倍数和五的倍数的和再减去十五的倍数的和,即: \[ s=\sum_{i=1}^{333}3i+\sum_{i=1}^{199}5i-\sum_{i=1}^{66}15i=\frac{3}{2}\cdot333(333+1)+\frac{5}{2}\cdot199(199+1)-\frac{15}{2}\cdot66(66+1) \] 第一种思路的实现代码如下: def main(): ans = sum([x for x in range(1,1000) if x%3==0 or x%5==0]) return ans 二、偶数斐波那契数(even Fibonacci numbers) 斐波那契序列中的数都是由前两项加总得出,假设第一与第二项为1与2,则前十项分别为: \[ 1,2,3,5,8,13,21,34,55,89 \] 考虑不超过四百万的斐波那契数

取石子(斐波那契博弈)

大兔子大兔子 提交于 2019-12-03 20:55:26
题意: http://acm.hdu.edu.cn/showproblem.php?pid=2516 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数 不能超过上次取子数的2倍 。取完者胜.先取者负输出"Second win".先取者胜输出"First win". 1 #include<iostream> 2 using namespace std; 3 int main() { 4 int n, i,flag=1; 5 int a[1000] = { 0 }; 6 a[0] = 0; a[1] = 1; a[2] = 1; 7 for (i = 3; i < 1000; i++) { 8 a[i] = a[i - 1] + a[i - 2]; 9 } 10 while (cin >> n) { 11 if (n == 0) 12 exit(0); 13 else { 14 for (i = 3; i < 1000; i++) { 15 if (n == a[i]) { 16 cout << "Second win" << endl; 17 flag = 0; 18 break; 19 } 20 } 21 if (flag == 1) { 22 cout << "First win" << endl; 23 } 24 else { 25

牛客竞赛 -斐波那契

时光怂恿深爱的人放手 提交于 2019-12-03 06:34:51
题目描述 设f[i]表示斐波那契数论的第i项 f[1]=1,f[2] =1,f[i] = f[i - 1] + f[i - 2] 给定一个n 求f[n-1]*f[n+1]-f[n]^2f[n−1]∗f[n+1]−f[n] 2 输入描述: 一个整数n 输出描述: 一个整数,表示答案 备注: 对于30 %30%的数据,n \leqslant 5n⩽5 对于50 %50%的数据,n \leqslant 10^5n⩽10 5 对于80 %80%的数据,n \leqslant 10^{15}n⩽10 15 对于100 %100%的数据,2 \leqslant n \leqslant 10^{1000000}2⩽n⩽10 1000000 **令g(n)=f[n-1]*f[n+1]-f[n]^2** 可以推出g(n)=-g(n-1) g(2)=1 答案只有1和-1 这tm不是数学题吗? #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int N=1000000+10; int n; int main(){ char c; while(c=getchar()){ if(c=='\n')break; n=c-'0'; } if(n%2==0

斐波那契

匿名 (未验证) 提交于 2019-12-03 00:21:02
题目: 一只成熟的兔子每天能产下一胎兔子。每只小兔子的成熟期是一天。 某人领养了一只小兔子,请问第N天以后,他将会得到多少只兔子。 看到题有没有很懵逼,恩,我当时也是这么想的,一只兔子且不说一天就成熟了,还能自己生下一只,然后就去查了类似的问题,还有一次生下一公一母的,然后再生一公一母。他们不是亲兄妹的吗,emmmm好吧,数学家的世界不太懂 第一天,只有小兔子。1只 第二天,变成大兔子。1只 第三天,产下一直小兔子,一只大兔子,一只小兔子。2只 第四天,大兔子产下小兔子,小兔子成熟。3只 第五天,两只大兔子产下小兔子,一只小兔子成熟。5只 第六天,产三只,两只成熟。8只 第七天,产5只,三只成熟。13只 ……………… 你可以看出,这是一个数列,这个数列从第三个数起等于前两个数的和,既 1,1,2,3,5,8,13,21. 这个数列叫做斐波那契数列,非常著名。 于是我们就先建立一个数列去存放这些数 int f[100];//定义了一个大小为100的数组,其实应该定义成f[N],这样只是为了方便修改 int i; f[1]=f[2]=1; for(i>3;i<=N;i++) //其中N是这道题的上限,为90 f[i] = f[i-1]+f[i-2]; 然后再使用的时候,输入第几天,就直接去数组中找呢一天对应的值输出 #include <stdio.h> #define N 90 int

Coffee Chicken (斐波那契字符串)

匿名 (未验证) 提交于 2019-12-03 00:09:02
S(1) = {"COFFEE"}S(1)="COFFEE"; S(2) = {"CHICKEN"}S(2)="CHICKEN"; S(n) = S(n-2) :: S(n-1) 给n和k 求出S(n)从第k位开始往后的10的字符 递归定位,枚举10个位 #include <bits/stdc++.h> using namespace std; typedef long long ll; #define inf 0x3f3f3f3f const int maxn=505; const ll N=1e12+10; ll f[maxn]; string s[550]; int num; void solve(int n,ll k) { if(n==1) cout<<s[1][k-1]; else if(n==2) cout<<s[2][k-1]; else { if(k>f[n-2]) solve(n-1,k-f[n-2]); else if(k<=f[n-2]) solve(n-2,k); } } int main( ) { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin>>t; f[1]=6; f[2]=7; for(int i=3;i<=500;i++) f[i]=min(f[i-1]+f[i-2]

509. 斐波那契数

匿名 (未验证) 提交于 2019-12-02 23:32:01
斐波那契数 F(n) 斐波那契数列 0 1 N F(N) 。 示例 1: 输入: 2 输出: 1 解释: F(2) = F(1) + F(0) = 1 + 0 = 1. 示例 2: 输入: 3 输出: 2 解释: F(3) = F(2) + F(1) = 1 + 1 = 2. 示例 3: 输入: 4 输出: 3 解释: F(4) = F(3) + F(2) = 2 + 1 = 3. 提示: N class Solution { public: int fib(int N) { if(N<=1) return N; return fib(N-1)+fib(N-2); } }; 文章来源: https://blog.csdn.net/qq_23283325/article/details/89874869

51nod1070斐波那契博弈

匿名 (未验证) 提交于 2019-12-02 23:30:02
1070 Bash游戏 V4 1 秒 131,072 KB 20 分 3 级题 有一堆石子共有N个。A B两个人轮流拿,A先拿。每次拿的数量最少1个,最多不超过对手上一次拿的数量的2倍(A第1次拿时要求不能全拿走)。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N,问最后谁能赢得比赛。 例如N = 3。A只能拿1颗或2颗,所以B可以拿到最后1颗石子。 收起 输入 第 1 行:一个数 T ,表示后面用作输入测试的数的数量。( 1 <= T <= 1000 ) 第 2 - T + 1 行:每行 1 个数 N 。( 1 <= N <= 10 ^ 9 ) 输出 共 T 行,如果 A 获胜输出 A ,如果 B 获胜输出 B 。 输入样例 3 2 3 4 输出样例 B B A #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define ll long long using namespace std ; int fib [ 50 ]; ll n ; int t ; void init () { fib [ 0 ]= 1 ; fib [ 1 ]= 2 ; for ( int i = 2 ; i <= 45 ; i ++) fib [ i ]= fib

jzoj_斐波那契_2

こ雲淡風輕ζ 提交于 2019-12-02 15:41:14
Description   小明有一个数列。   a[0] = a[1] = 1。   a[i] = i * a[i - 1] * a[i - 2](i≥2)。   小明想知道a[n]的因子个数。 Input   输入仅一个正整数n。 Output   输出a[n]的因子个数mod 1,000,000,007的值。 Sample Input   3 Sample Output   4 Hint   【数据范围】   对于30%的数据满足0≤n≤1,000。   对于100%的数据满足0≤n≤1,000,000。 筛素因子个数和可太骚了 利用埃式筛法非线性的缺点, 就是每个合数都会被她的所有苏影子筛一遍, 这道题就从苏影子出发,枚举包含苏影子的和数 #include<iostream> #include<cstdio> #define ri register int #define u long long namespace opt { inline u in() { u x(0),f(1); char s(getchar()); while(s<'0'||s>'9') { if(s=='-') f=-1; s=getchar(); } while(s>='0'&&s<='9') { x=(x<<1)+(x<<3)+s-'0'; s=getchar(); } return x*f;