完全数
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。有6、28、496、8128等等。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
输入n,请输出n以内(含n)完全数的个数。 数据范围: 1<=n<5*10的5次方
输入描述
输入一个数字n。
输出描述
输出不超过n的完全数的个数
示例
输入:1000
输出:3
思路
-
利用双层for循环,外层循环判断2到n,内层判断其是否为完全数,若是,则计数器+1。
-
判断因子:循环遍历1到n-1,对其取余,看余数是否为0,为0则表示能除尽,即是因子数。
具体实现
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,sum=0,cnt=0;
cin>>n;
for(int i=2; i<=n; i++){ //外层循环2到n
for(int j=1; j<i; j++){ //内层为判断i是否为完美数
if(i%j==0) sum+=j; //因子数相加
}
if(sum==i) cnt++; //判断因子数是否等于本身,若相等则计数器+1
sum=0; //判断结束,sum置零重新循环加和
}
cout<<cnt;
return 0;
}
求二叉树最大深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为1。
数据范围:节点的数量满足 0≤n≤100,节点上的值满足0≤val≤100。 进阶:空间复杂度 O(1) ,时间复杂度O(n)。
假如输入的用例为{1,2,4,#,#,5,7,#,#,#,3,#,6,#,#},那么如下图:
示例
输入:1 2 4 # # # 3 # #
输出:3
思路
-
定义二叉树数据结构。
-
写一个递归函数:先序遍历建立二叉树。
-
写一个递归函数:求二叉树深度。
-
在主函数中调用函数,建立二叉树和求深度。最后输出。
具体实现
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
string data;
struct node *lchild, *rchild;
node(string x):data(x), lchild(nullptr), rchild(nullptr){}
}*BitTree;
//先序遍历创建二叉树
void CreatT(BitTree &T){
string c;
cin>>c;
if(c == "#") T=nullptr;
else{
T = new node(c);
CreatT(T->lchild);
CreatT(T->rchild);
}
}
//求二叉树深度
int Deepth(BitTree T){
if(T == nullptr) return 0;
int x = Deepth(T->lchild);
int y = Deepth(T->rchild );
return max(x,y)+1;
}
int main(){
BitTree T;
CreatT(T);
cout<<Deepth(T);
return 0;
}
小结
-
二叉树的递归的代码必须要熟练掌握。
-
注意测试用例,用先序遍历,所以测试用例必须是先序的次序才可以,用其他序是输出不了结果的!!!