附加题:分支程序设计
判断回文数
任务描述
本关任务:所谓“回文”是一种特殊的或者文字短语。它们无论是顺读还是倒读,结果都是一样。例如,以下的几个 5 位整数都是回文数:12321、77777、89998 和 44774。编写一个程序,读入一个 5 位整数后,判断它是否是回文数。
测试说明
输入描述:一个 5 位整数
输出描述:“Yes”或“No”
样例输入1:12321
样例输出1:Yes
样例输入2:12323
样例输出2:No
参考代码
#include <iostream>
using namespace std;
int main(void) {
/******** Begin ********/
int n; cin >> n;
if (n/10000 == n%10 && n/1000%10 == n/10%10)
cout << "Yes" << endl;
else cout << "No" << endl;
/******** End ********/
return 0;
}
二次函数
任务描述
本关任务: 对于任意定义域为 $\mathbb{R}$,且在 $\mathbb{R}$ 上连续的函数 $f(x)$,定义 函数 $\mathop{max}f(x)$ 为区间 $[x,x+1]$ 上 $f(x)$ 的最大值; 函数 $\mathop{min}f(x)$ 为区间 $[x,x+1]$ 上 $f(x)$ 的最小值。 即 $\mathop{max}f(x) = \max_{t\in[x,x+1]} f(t)$ $\mathop{min}f(x) = \min_{t\in[x,x+1]} f(t)$
已知二次函数$f(x)=x^2-2x+2$,给定 $x$ , 求 $\mathop{max} \mathop{min} f(x)$ 和 $\mathop{min} \mathop{max} f(x)$。
相关知识
为了完成本关任务,你需要掌握:1.C++分支结构;2.初中数学知识。
说明
比如求$\mathop{max} \mathop{min} f(x)$。 $g(x)=\mathop{min} f(x)$是一个关于$x$的函数,意义是$f(x)$在区间$[x,x+1]$的最小值; $h(x)=\mathop{max} g(x)$也是一个关于$x$的函数,意义是$g(x)$在区间$[x,x+1]$的最大值。 所以给定$x$,$h(x)$是$g(x)$在区间$[x,x+1]$的最大值,而每一个$g(t)(x\leq t\leq x+1)$都是$f(x)$在区间$[t,t+1]$的最小值。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
输入描述
一个整数$x$,$(-1000 \leq x \leq 1000)$
输出描述
两个小数,分别精确到小数点后3位,以一个空格相间,表示答案
样例一
输入:0
输出:1.000 1.250
样例二
输入:1
输出:2.000 2.000
参考代码
#include <iostream>
#include <iomanip>
using namespace std;
int main(void) {
/******** Begin ********/
int x; cin >> x;
if (x == 0) cout << fixed << setprecision(3) << 1.0 << " " << 1.25 << endl;
else cout << fixed << setprecision(3) << x*x+1.0 << " " << x*x+1.0 << endl;
/******** End ********/
return 0;
}
电话数据加密
任务描述
本关任务:一个公司想通过电话传输数据,但是担心电话可能被窃听。这个公司的所有的数据都采用 4 位整数的形式进行传输。对于一个 4 位整数,他们按如下方法进行加密:首先,将每位数字替换成它与 7 相加之和再用 10 取模的结果。然后,对替换后的数,其第 1 位和第 3 位相交换,第 2 位和第 4 位相交换。我们要求编写这样一个程序:对于输入的两个 4 位整数 n,m,输出分别对 n 加密和对 m 解密的结果。(对于加密或者解密后出现小于 1000 的情况,不输出第一位的 0)。
测试说明
输入描述:两个 4 位整数 n,m(1000<=n,m<=9999),使用一个空格分隔。 输出描述:对 n 加密和 对m 解密之后的结果,使用一个空格分隔。
样例输入1:1234 5678
样例输出1:189 189
样例输入2:8071 4287
样例输出2:4857 1075
参考代码
#include <iostream>
#include <iomanip>
using namespace std;
int main(void) {
/******** Begin ********/
int n, m;
cin >> n >> m;
cout << (n/10%10+7)%10 * 1000
+ (n%10+7)%10 * 100
+ (n/1000+7)%10 * 10
+ (n/100%10+7)%10
<< " "
<< (m/10%10+3)%10 * 1000
+ (m%10+3)%10 * 100
+ (m/1000+3)%10 * 10
+ (m/100%10+3)%10;
/******** End ********/
return 0;
}
奇偶分解
任务描述
本关任务:总所周知,对于任何一个正整数 $n$,存在唯一的非负整数 $k$和正奇数 $q$使得 $n=2^kq$。比如 $10=2^1\times 5$,$8=2^3\times 1$,$15=2^0\times 15$ 等。 给定 $n\ (1\leq n\leq 128)$,输出相应的 $k$ 和 $q$。
相关知识
为了完成本关任务,你需要掌握:C++分支语句。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
输入描述
一行,一个正整数 $n$,保证 $1\leq n\leq 128$。
输出描述
一行,两个整数 $k$ 和 $q$,以一个空格相间。
样例1
输入:10
输出:1 5
样例2
输入:8
输出:3 1
参考代码
#include <iostream>
using namespace std;
int main(void) {
/******** Begin ********/
int n; cin >> n;
int k = 0;
if (n%2 == 0) n/=2, k++;
if (n%2 == 0) n/=2, k++;
if (n%2 == 0) n/=2, k++;
if (n%2 == 0) n/=2, k++;
if (n%2 == 0) n/=2, k++;
if (n%2 == 0) n/=2, k++;
if (n%2 == 0) n/=2, k++;
cout << k << " " << n << endl;
/******** End ********/
return 0;
}
参考代码二(使用循环)
#include <iostream>
using namespace std;
int main(void) {
/******** Begin ********/
int n; cin >> n;
int k = 0;
while (n%2==0) n/=2, k++;
cout << k << " " << n << endl;
/******** End ********/
return 0;
}