二叉排序树
对于一棵二叉排序树深度为K,节点数为 2k−1 ,节点值为1至 2k−1 。给出K和任意三个节点的值,输出包含该是三个节点的最小子树的根节点。
测试样例:
输入:
4 10 15 13输出:
12
思路:
一棵深度为4的满二叉排序树如所示:
观察每层最开始节点值为 2i−1 。找出输入的三个节点值中的最大值和最小值,循环除 2i−1 ,直至结果不一致。最大值除 2i−1 取整再乘 2i−1 即为所求。
#include <iostream>
#include <math.h>
using namespace std;
int max(int a,int b,int c)
{
return (a>b?a:b)>c?(a>b?a:b):c;
}
int min(int a,int b,int c)
{
return (a<b?a:b)<c?(a<b?a:b):c;
}
int main()
{
int k,a,b,c;
cin>>k>>a>>b>>c;
int i=k-1;
int Max=max(a,b,c);
int Min=min(a,b,c);
while(i>=0)
{
int left=Max/(int)pow(2.0,i);
int right=Min/(int)pow(2.0,i);
if(left!=right)
break;
i--;
}
int root=(int) (Max/(int)pow(2.0,i)*(int)pow(2.0,i));
cout<<root<<endl;
return 0;
}
格式化输出
编写代码,接收从屏幕输入的长度为16字节整数倍的字符串(均为可见字符),按示例格式排版输出。
测试样例:
输入:
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl输出:
16进制偏移 16进制表示(每行16个字符)* 原文*
双空格分隔 双空格分隔 双空格分隔
00000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 abcdefghijklmnop
00000010 71 72 73 74 75 76 77 78 79 7a 61 62 63 64 65 66 qrstuvwxyzabcdef
00000020 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 ghijklmnopqrstuv
00000030 77 78 79 7a 61 62 63 64 65 66 67 68 69 6a 6b 6c wxyzabcdefghijkl
思路:
难点在于字符串的转义和16进制偏移的输出,掌握printf()的格式化规定符即可解决。
#include <iostream>
#include <string>
#include <algorithm >
using namespace std;
int main()
{
string str;
cin>>str;
//16进制转义
char *temp=new char [3*str.size()];//一个字符转义为2个数字和1个空格
for(int i=0;i<str.size();i++)
sprintf(temp+3*i,"%x ",(int)str[i]);
string res=temp;
//输出
unsigned int bais=0x00000000;
for(int i=0;i<str.size()/16;i++)
{
printf("%08x ",bais);
cout<<res.substr(i*48,24)<<" ";
cout<<res.substr(i*48+24,24)<<" ";
cout<<str.substr(i*16,16)<<endl;
bais+=0x00000010;
}
return 0;
}