目录
1.数的划分
2.求先序排列
3.平方计算
4.三角形高
5.单词复数
1.数的划分
问题描述
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
输入格式
n,k
输出格式
一个整数,即不同的分法
样例输入
7,3
样例输出
4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}
数据规模和约定
6<n<=200,2<=k<=6
示例代码
#include<iostream>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
int cnt = 0;
for (int a = 1; a <= (n / k); a++) {//让算法运行时间更短
for (int b = a; b <= (n - a); b++) {//为了保证不重复,必须大于等于前一个数
if (k == 2) {//如果由两个数组成
if (a + b == n) {
cnt++;
}
}
else {
for (int c = b; c <= (n - a - b); c++) {
if (k == 3) {//如果由三个数组成
if (a + b + c == n) {
cnt++;
}
}
else {
for (int d = c; d <= (n - a - b - c); d++) {
if (k == 4) {//如果由四个数组成
if (a + b + c + d == n) {
cnt++;
}
}
else {
for (int e = d; e <= (n - a - b - c - d); e++) {
if (k == 5) {//如果由五个数组成
if (a + b + c + d + e == n) {
cnt++;
}
}
else {//如果由六个数组成
for (int f = e; f <= (n - a - b - c - d - e); f++) {
if ((a + b + c + d + e + f) == n) {
cnt++;
}
}
}
}
}
}
}
}
}
}
}
cout << cnt;
return 0;
}
2.求先序排列
问题描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
输入格式
两行,每行一个字符串,分别表示中序和后序排列
输出格式
一个字符串,表示所求先序排列
样例输入
BADC
BDCA
样例输出
ABCD
三种排列详解
一颗非空的二叉树由根节点及左、右子树这三个基本部分组成。二叉树的遍历有三种常用方式,分别为先序遍历(根节点->左子树-> 右子树)、中序遍历(左子树-> 根节点 -> 右子树)和后序遍历(左子树-> 右子树-> 根节点)。
更详细请看https://blog.csdn.net/elma_tww/article/details/85640912
示例代码
#include<iostream>
#include<string.h>
using namespace std;
char geng;
int index;
string a, b;
char zhong[8], hou[8];
void dfs(char zhong[8],char hou[8]) {
char zhuo1[8], you1[8], zhuo2[8], you2[8];
if (zhong[0] == '\0') {//如果该子树已经为空,则程序结束,返回上一步
return;
}
int len = 0;
//cout << "该中序子树为";
for (int i = 0; i < 8; i++) {//找到该子树长度
//cout << zhong[i] <<" ";
if (zhong[i]<65 || zhong[i]>90) {
break;
}
len++;
}
//cout << endl;
//cout << "该子树长度为 "<<len << endl;
geng = hou[len - 1];//根节点
cout << geng;
if (len == 1) {//只有根节点
return;
}
//得到新的左子树和右子树
memset(zhuo1,'\0',sizeof(zhuo1));
memset(zhuo2,'\0',sizeof(zhuo2));
memset(you1,'\0',sizeof(you1));
memset(you2,'\0',sizeof(you2));
//cout << "找索引值";
for (int i = 0; i <len; i++) {
//cout << zhong[i]<<" ";
if (zhong[i] == geng) {
//cout << endl<<"找到了"<<zhong[i] << " ";
index = i;
break;
}
}
//cout << endl;
//cout << "该根的索引值为 " << index << endl;
//cout << "中序左子树";
for (int i = 0;i<index; i++) {//中序左子树
zhuo1[i] = zhong[i];
//cout << zhuo1[i];
}
//cout << endl;
//cout << "中序右子树";
for (int i = index + 1; i < len; i++) {//中序右子树
you1[i-index-1] = zhong[i];
//cout << you1[i - index - 1];
}
//cout << endl;
//cout << "后序左子树";
for (int i = 0; i < index; i++) {//后序左子树
zhuo2[i] = hou[i];
//cout << zhuo2[i];
}
//cout << endl;
//cout << "后序右子树";
for (int i = index; i < len - 1; i++) {//后序右子树
you2[i - index] = hou[i];
//cout << you2[i - index];
}
//cout << endl;
dfs(zhuo1, zhuo2);
dfs(you1, you2);
return;
}
int main() {
cin >> a >> b;
int cnt = a.length();
//cout << "一开始长度" <<cnt<< endl;
for (int i = 0; i < cnt; i++) {
zhong[i] = a[i];
hou[i] = b[i];
}
dfs(zhong, hou);
system("pause");
return 0;
}
3.平方计算
问题描述
输入正整数a, m,输出a^2%m,其中^表示乘方,即a^2表示a的平方,%表示取余。
输入格式
输入包含两个整数a, m,a不超过10000。
输出格式
输出一个整数,即a^2%m的值。
样例输入
5 6
样例输出
1
示例代码
#include<iostream>
using namespace std;
int main() {
int a, b, ans;
cin >> a >> b;
a = a * a;
ans = a % b;
cout << ans;
return 0;
}
4.三角形高
问题描述
编写一个程序,输入三个实数(double类型)a、b和c作为三角形的三条边;如果三条边能构成三角形,则输出最长边对应的高的长度;如果不能构成三角形,则输出“NO”。结果保留6位小数。
提示:三角形面积计算可以采用海伦-秦九韶公式:
S=sqrt( p(p-a)(p-b)(p-c) )
p = (a+b+c) / 2
样例输入
1.0 2.0 3.0
样例输出
NO
样例输入
3.0 4.0 5.0
样例输出
2.400000
示例代码
#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
int main() {
double a, b, c, temp, p, s, ans, max = 0;
cin >> a >> b >> c;
if (max < a) {//找最大边
max = a;
}
if (max < b) {
max = b;
}
if (max < c) {
max = c;
}
if ((a + b > c) && (a + c > b) && (b + c > a)) {//任意两边之和大于第三边
p = (a + b + c) / 2;
temp = p * (p - a) * (p - b) * (p - c);
s = sqrt(temp);
ans = 2 * s / max;
cout << fixed << setprecision(6) << ans << endl;
}
else {
cout << "NO";
}
return 0;
}
5.单词复数
问题描述
编写一个函数RegularPlural,其功能是实现一个英文单词的复数形式。复数的规则为:
如果单词末尾为s,x,z,ch或sh,则在后面加es;
如果单词末尾为y,且前一个字母为辅音(除a, e, i, o, u以外的其它情况),则把y改成ies;
如果是其它情形,一律在后面加s。
编写测试程序,输入一个长度小于20的单词,输出该单词的复数形式。(注:出自课本第七章第9题)
样例输入
box
样例输出
boxes
示例代码
#include<iostream>
#include<string.h>
using namespace std;
char s[20];
void RegularPlural(char s[20]) {
int len = strlen(s);
//cout << len << endl;
if (s[len - 1] == 's' || s[len - 1] == 'x' || s[len - 1] == 'z' || ((s[len - 1] == 'h') && ((s[len - 2] == 'c') || s[len - 2] == 's'))) {//第一种情况
s[len] = 'e';
s[len + 1] = 's';
}
else if ((s[len - 1] == 'y') && (s[len - 2] != 'a' && s[len - 2] != 'e' && s[len - 2] != 'i' && s[len - 2] != 'o' && s[len - 2] != 'u')) {//第二种情况
s[len - 1] = 'i';
s[len] = 'e';
s[len + 1] = 's';
}
else {//第三种情况
s[len] = 's';
}
return;
}
int main() {
cin >> s;
RegularPlural(s);
int cnt = strlen(s);
//cout << cnt << endl;
for (int i = 0; i < cnt; i++) {
cout << s[i];
}
return 0;
}