最大公倍数
样例输入:
5 15
样例输出:
5
样例输入:
7 2
样例输出:
1
AC
#include <stdio.h>
int gcd(int n, int m) {
return m == 0 ? n : gcd(m, n % m);
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
printf("%d\n", gcd(n, m));
}
字符串反转
输入
abcd
输出
dcba
AC
#include <stdio.h>
void Rever() {
char s;
scanf("%c", &s); //输入a,然后跳转递归,输入b
if (s != '\n') {
Rever();
printf("%c", s);
}
return;
}
int main() {
Rever();
return 0;
}
递归形式插入排序
问题描述
对数组0~倒数第一个排序等价于:
对数组的0~倒数第二个元素,这部分排序
然后把是后一个元素插入到这个有序的部分中
AC
#include <stdio.h>
#include <malloc.h>
void InsertSort(int *&arr, int N) {
if (N == 0) //跳出条件
return;
InsertSort(arr, N - 1); //缩小问题规模
int x = arr[N]; //当前数组值
int index = N - 1; //前一个数组下标
while (index > -1 && x < arr[index]) {
arr[index + 1] = arr[index]; //往后挪位置
index--;
}
arr[index + 1] = x;
}
/*
void Insert(int *arr, int N) { // 法2
int t;
if (N == 0)
return;
Insert(arr, N - 1);
while (N > 0) {
if (arr[N] < arr[N - 1]) {
t = arr[N - 1];
arr[N - 1] = arr[N];
arr[N] = t;
}
N--;
}
return;
}
*/
//while (n > 0 && arr[n] < arr[n - 1])
//不能这个写,会造成短路
int main() {
int *arr, N;
scanf("%d", &N);
arr = (int *)malloc(sizeof(int) * N);
for (int i = 0; i < N; i++)
scanf("%d", &arr[i]);
InsertSort(arr, N - 1); // !!! N个数,N-1次挪动
for (int i = 0; i < N; i++)
printf("%d", arr[i]);
printf("\n");
}
汉诺塔
问题描述:
从左到右 A B C 柱 大盘子在下, 小盘子在上,
借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则:
大盘子只能在小盘子的下面.
输入
圆盘个数
输出
圆盘移动过程
算法思想
利用栈理解递归
AC
#include <iostream>
using namespace std;
void Hanoi(int n, char x, char y, char z);
int main()
{
int n;
cout << "Please input num:";
cin >> n;
Hanoi(n, 'A', 'B', 'C');
return 0;
}
void Hanoi(int n, char A, char B, char C) //注意传入参数顺序的改变
{
if(n == 1) //结束条件只剩一个圆盘
cout << "no." << n << " from " << A << " to " << C << endl; //将第n个盘子从A移至C
else
{
Hanoi(n - 1, A, C, B); //将n-1个s盘子从A到B,借助C
cout << "no." << n << " from " << A << " to " << C << endl; //将第n个盘子从A移至C
Hanoi(n - 1, B, A, C); //将n-1个盘子从B到C,借助A
}
}