判断回文:
回文数:121.12321.6996.。。
思路:将输入数字转为逆序数,并且进行比对。
详细思路:利用循环除10直到出完为止,每次得到的结果是从高到低位的值,循环中从低到高进行数位构造,从而构造逆序数。
#include <iostream>
#include <string>
using namespace std;
bool symm(unsigned n) {
unsigned i = n;
unsigned m = 0;
while (i > 0) {
m = m * 10 + i % 10;
i /= 10;
}
return m == n;
}
int main() {
cout << "构造逆序数进行回文判断" << endl;
int m;
cin >> m;
if (symm(m) == 1) cout << "yes" << endl;
else cout << "no";
}
汉诺塔问题:
有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移到柱子C上,并且每次移动,同一根柱子上都只能是大盘子在下,小盘子在上,请问至少需要多少次移动?
由于初始A的盘子从上往下依次增大,因此最大的必然在A的底部,并且最后一步的行为是将底盘从A移到空白的C柱子上,再将B的移到C上。(递归的结束条件)
而倒推前n-1个盘子,将A上的n-1个盘子移到B,则是该函数的递归使用,只是初始位置和最终位置发生了变化。因此可以将盘子从A移到C分解为3个步骤--
- 将A上的n-1个盘子移到B(借助C)
- 将A上剩余一个移到C
- 将n-1个从B移到C(借助A)
这三个步骤递归即可完成
两个动作:
(1)将多个盘子从一个柱子移到另一个--递归函数hanoi
(2)将一个盘子从一个柱子移到另一个(move函数)
#include <iostream>
using namespace std;
void move(char src, char dest) {
cout << src << "-->" << dest << endl;
}
//将src最上面的移到dest
void hanoi(int n, char src, char medium, char dest) {
if (n == 1)
move(src, dest);
else {
hanoi(n - 1, src, dest, medium);
move(src, dest);
hanoi(n - 1, medium, src, dest);
}
}
int main() {
int m;
cout << "输入盘的数量" << endl;
cin >> m;
hanoi(m, 'A', 'B', 'C');
return 0;
}