基础阶段
🫓1. 欧几里得减法:递归求最大公约数
- 如果
d能整除a且d能整除b,那么d也能整除a-b。- 反之,如果
d能整除a-b和b,那么d也能整除a。
假设 a 和 b 的最大公约数是 d。
- 想象有两根长度分别为 a 和 b 的棍子,它们都可以被长度为 d 的小棍整除(即a和b都是d的整数倍)。
#include<stdio.h>
int Gcd(int a,int b) {
if (a > b) {
return Gcd(a - b, b);
}
else if (a < b) {
return Gcd(a, b - a);
}
else if (a == b) {
return a;
}
}
int main() {
int m, n;
scanf_s("%d,%d", &m, &n);
printf("%d\n",Gcd(m,n));
return 0;
}
2. 递归进制转换
#include<stdio.h>
void Eight(int a) {
if (a / 8 != 0) {
Eight(a / 8);
printf("%d", a % 8);
}
else {
printf("%d", a);
}
}
int main() {
int n;
while (scanf_s("%d", &n) != EOF) {
Eight(n);
printf("\n");
}
return 0;
}
3. 吃糖果
#include<stdio.h>
int f(int a) {
if (a>2) {
return f(a - 1) + f(a - 2);
}
else if (a==2) {
return 2;
}
else if (a == 1) {
return 1;
}
}
int main() {
int n;
while (scanf_s("%d", &n) != EOF) {
printf("%d\n", f(n));
}
return 0;
}
🫓4.直线分平面
逻辑不太明白 暂时用枚举法
#include<stdio.h>
int f(int a) {
if (a>1) {
return f(a - 1) + a;
}
else if (a == 1) {
return 2;
}
}
int main() {
int n;
while (scanf_s("%d", &n) != EOF) {
printf("%d\n", f(n));
}
return 0;
}
🫓5. 折线分平面
if (a == 1) {
return 2;
}
else {
return f(a - 1) + 4 * a - 3;
//n-1条折线相当于2n-2条射线
//当引入第n条折线,先引入第一条射线, 会增加 2n-1个平面
//再引入第二条射线,再会增加2n-2个平面(因为有一个分出来的平面和之前的连通,故去掉一个)
}
6. 骨牌
#include<stdio.h>
int f(int a) {
if (a>3) {
return f(a - 1) + f(a - 2)+f(a-3);
}
else if (a==3) {
return 4;
}
else if (a == 2) {
return 2;
}
else if (a == 1) {
return 1;
}
}
int main() {
int n;
scanf_s("%d", &n);
printf("%d\n", f(n));
return 0;
}