古典问题:
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
本质是Fabonacci数列。
#include <stdio.h>
int r(int , int , int );
int main(int argc, const char *argv[])
{
int i;
scanf("%d", &i);
printf("%d\n", r(1, 0, i));
return 0;
}
int r(int a, int b, int c)
{
if(c >= 2)
return r(a + b, a, c - 1);
return a;
}
全排列问题:
有0、1、2、3个数字,能组成多少个互不相同且无重复数字的四位数?都是多少?
本质是递归全排列
// 有0、1、2、3个数字,能组成多少个互不相同且无重复数字的四位数?都是多少?
// 递归全排列
#include <iostream>
using namespace std;
int flag = 0;
//交换函数
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
//递归函数
void recursion(int list[], int k, int m)
{
if (k == m && list[0] != 0) //递归基
{
flag++;
cout << flag << ":";
for (int i = 0; i < m; i++)
cout << list[i];
cout << endl;
}
else{
for(int i = k; i < m; i++)
{
swap(list[i], list[k]);
recursion(list, k+1, m);
swap(list[i], list[k]); //记得还原交换后的字符
}
}
}
int main(int argc, const char *argv[])
{
int a[] = {1,2,3,0};
recursion(a, 0, sizeof(a)/sizeof(a[0]));
return 0;
}
//运行结果
/*
1:1230
2:1203
3:1320
4:1302
5:1032
6:1023
7:2130
8:2103
9:2310
10:2301
11:2031
12:2013
13:3210
14:3201
15:3120
16:3102
17:3012
18:3021
*/
最大公约数最小公倍数问题:
输入两个正整数m和n,求其最大公约数和最小公倍数。
本质是欧几里德算法
#include <stdio.h>
//输入两个正整数m和n,求其最大公约数和最小公倍数。
//考点: 欧几里得算法
int gcd(int a, int b);
int main(int argc, const char *argv[])
{
int x, y;
while(scanf("%d %d", &x, &y))
{
if (x < y) //二值交换
{
y = x + y;
x = y - x;
y = y - x;
}
printf("(%d, %d) = %d\n", x, y, gcd(x, y));
printf("[%d, %d] = %d\n", x, y, (x * y) / gcd(x, y));
}
return 0;
}
int gcd(int a, int b)
{
return a % b == 0 ? b : gcd(b, a % b);
}
素数问题
给定范围找素数
本质是穷举
#include <stdio.h>
#include <math.h>
//题目:判断101-200之间有多少个素数,并输出所有素数。
int main(int argc, const char *argv[])
{
int i, j, n, flag, num = 0;
scanf("%d", &n);
for (i = 2; i < n; i++)
{
flag = 0;
for (j = 2; j <= sqrt(n+1); j++)
{
if (i % j == 0 && i != j)
{
flag = 1;
break;
}
}
if (flag == 0)
{
num++;
printf("%d:%d\n", num, i);
}
}
return 0;
}