22/10/23
1. 斐波那契数列
【问题描述】写一个函数,输入 n,求斐波那契(Fibonacci)数列的第 n 项 ( 即 F(N) ) 。斐波那契数列的定义如下:
【问题形式】
F(0)= 0, F(1) = 1 F(N)= F(N - 1)+ F(N - 2)
【样例输入输出】
输入:n = 2 输出:1 输入:n = 5 输出:5
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int Fib(int n)
{
if (n == 0) return 0;
else if (n == 1) return 1;
else return Fib(n-1) + Fib(n-2);
}
int main()
{
int n;
while (cin >> n)
{
cout<<Fib(n)<<endl;
}
system("pause");
return 0;
}
2. 神奇口袋
【问题描述】
给出n个小于40的正整数a1,a2 ... an,问凑出和为40有多少种方法。
因为有下标,因此值相同的数,也认为是不同的两个数
【问题形式】
输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。
【样例输入输出】
输入: 3 20 20 20 输出:3
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int arr[20] = {};
int method_of_num(int n,int num)
{
if (n == 1)
{
if (arr[n - 1] == num) return 1;
else if (num <= 0) return 1;//此处有疑问
else return 0;
}
else return method_of_num(n - 1, num) + method_of_num(n - 1, num - arr[n - 1]);
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
cout << method_of_num (n,40)<< endl;
system("pause");
return 0;
}
22/10/24
3.过河卒
【问题描述】
如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(图中的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点(中国象棋规定马走“日”字)。例如图中 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。
棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C不等于A,同时C不等于B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。
【输入形式】
输入一行4个整数,分别表示B点的坐标(n,m)以及对方马的坐标(X,Y)
【输出形式】
输出一个整数,表示路径的条数
【样例输入】
6 6 3 2
【样例输出】
17
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int numOfWay(int a,int b,int n, int m, int x, int y)
{
int p[9][2];
p[0][0] = x + 2, p[0][1] = y + 1;
p[1][0] = x + 1, p[1][1] = y + 2;
p[2][0] = x - 1, p[2][1] = y + 2;
p[3][0] = x - 2, p[3][1] = y + 1;
p[4][0] = x - 2, p[4][1] = y - 1;
p[5][0] = x - 1, p[5][1] = y - 2;
p[6][0] = x + 1, p[6][1] = y - 2;
p[7][0] = x + 2, p[7][1] = y - 1;
p[8][0] = x, p[8][1] = y;
for (int i = 0; i < 9; i++)
{
if (a == p[i][0] && b == p[i][1]) return 0;
}
if (a == n && b == m) return 1;
if (a > n || b > m) return 0;
else return numOfWay(a + 1, b, n, m, x, y) + numOfWay(a, b + 1, n, m, x, y);
}
int main()
{
int n, m, x, y;
cin >> n >> m >> x >> y;
cout << numOfWay(0, 0, n, m, x, y) << endl;
system("pause");
return 0;
}
2.土地分割(递归实现)
【问题描述】
对于一块m×n 的地块,需要将其划分为若干个相同正方形的方块,且每个方块的边长尽量地长。
【输入形式】
输入 m 和 n ( 1 ≤ m、 n ≤0.5×109), 分别表示地块的长和宽。
【输出形式】
输出两个整数,表示划分以后的正方形的个数以及边长。
【样例输入】
1680 640
【样例输出】
168 80
#include<iostream>
#include<cmath>
#include<iomanip>
#include<string>
using namespace std;
int gcd(long a, long b)
//分析可知,求最大正方形边长即求两边最大公约数,故直接用最大公约数函数
{
if (a < b)
{
swap(a, b);
}
if (b == 0)
{
return a;
}
return gcd(b, a % b);
}
int main()
{
long m, n;
cin >> m >> n;
long len = gcd(m, n);
long num = (n * m) / (len * len);
cout << num << " " << len << endl;
system("pause");
return 0;
}