目 录
一、随意组合
1.1问题描述
1.2问题分析
1.3流程图
1.4功能实现
1.5测试实例及运行结果
二、奇怪的比赛
2.1问题描述
2.2问题分析
2.3流程图
2.4功能实现
2.5测试实例及运行结果
三、palindrom
3.1问题描述
3.2问题分析
3.3流程图
3.4功能实现
3.5测试实例及运行结果
四、电话号码
4.1问题描述
4.2问题分析
4.3流程图
4.4功能实现
4.5测试实例及运行结果
一、随意组合
1.1问题描述
小明被绑架到X星球的巫师W那里。当时,W正在玩弄两组数据 (2 3 5 8) 和
(1 4 6 7),他命令小明从一组数据中分别取数与另一组中的数配对,共配成4对
(组中的每个数必被用到)。
小明的配法是:{(8,7),(5,6),(3,4),(2,1)}
巫师凝视片刻,突然说这个配法太棒了!
因为:
每个配对中的数字组成两位数,求平方和,无论正倒,居然相等:
87^2 + 56^2 + 34^2 + 21^2 = 12302
78^2 + 65^2 + 43^2 + 12^2 = 12302
小明想了想说:“这有什么奇怪呢,我们地球人都知道,随便配配也可以
啊!”
{(8,6),(5,4),(3,1),(2,7)}
86^2 + 54^2 + 31^2 + 27^2 = 12002
68^2 + 45^2 + 13^2 + 72^2 = 12002
巫师顿时凌乱了。。。。。
请你计算一下,包括上边给出的两种配法,巫师的两组数据一共有多少种配
对方案具有该特征。
配对方案计数时,不考虑配对的出现次序。
就是说:{(8,7),(5,6),(3,4),(2,1)}与{(5,6),(8,7),(3,4),(2,1)}是同一种
方案。
1.2问题分析
计算符合题目要求的配对方法,这里我们要利用algorithm算法库中的next_permutation(a,a+4),对其中一组数据进行全排列,然后通过各位和十位交换后的平方和相等来作为判断条件。
1.3流程图
1.4功能实现
#include
#include
using namespace std;
int ans;
int a[4] = {2, 3, 5, 8};
int b[4] = {1, 4, 6, 7};
int main()
{
do
{
int left = 0, right = 0;
for(int i = 0; i < 4; i ++)
{
int x = a[i] * 10 + b[i];
int y = b[i] * 10 + a[i];
right += y * y;
}
if(left == right) ans ++;
}while(next_permutation(a, a + 4))
cout << ans << endl;
return 0;
}
1.5测试实例及运行结果
二、奇怪的比赛
2.1问题描述
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,
当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按
错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他
(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和
0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
2.2问题分析
利用c++,用递归的方法,定义起始变量score=10,k=1,进行题中满足条件的相应运算,最终判断成绩若满足score=100进行输出0和1
2.3流程图
2.4功能实现
#include
#include
using namespace std;
int grade[11]={0};
//递归
void slove1(int score,int k)
{
if(score<=0||k==11)
{
if(score==100)
{
for(int i=1;i<=10;i++){
cout<
2.5测试实例及运行结果
三、palindrom
3.1问题描述
Statement of the Problem
We say that a number is a palindrom if it is the sane when read from left to right or
from right to left. For example, the number 75457 is a palindrom.
Of course, the property depends on the basis in which is number is represented. The
number 17 is not a palindrom in base 10, but its representation in base 2 (10001) is a
palindrom.
The objective of this problem is to verify if a set of given numbers are palindroms in
any basis from 2 to 16.
Input Format
Several integer numbers comprise the input. Each number 0 < n < 50000 is given in
decimal basis in a separate line. The input ends with a zero.
Your program must print the message Number i is palindrom in basis where I is the
given number, followed by the basis where the representation of the number is a
palindrom. If the number is not a palindrom in any basis between 2 and 16, your
program must print the message Number i is not palindrom.
我们把从左往右和从右往左念起来相同的数字叫做回文数。例如,75457就是一个回文数。
当然某个数用某个进制表示不是回文数,但是用别的进制表示可能就是回文数。
例如,17是用十进制表示的数,显然它不是一个回文数,但是将17用二进制表示出来是10001,显然在二进制下它是一个回文数。
现在给你一个用十进制表示的数,请你判断它在2~16进制下是否是回文数。
输入:输入包含多组测试数据。每组输入一个用十进制表示的正整数n(0
输出:对于每组输入,如果n在2~16进制中的某些进制表示下是回文数,则输出“Number i is palindrom in basis ”,在后面接着输出那些进制。其中i用n的值代替,后面输出的进制中,每两个数字之间空一个。
如果n在2~16进制的表示下都不为回文数,则输出“Number i is not palindrom”,其中i用n的值代替。
3.2问题分析
用decimalToMRadix函数将 n 十进制转化成 m(2-16) 进制,用if语句中str.equals(strreverse)判断是否是回文,将结果进行输出
3.3流程图
3.4功能实现
package yfkh;
import java.util.Scanner;
public class jftuj {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n;
while((n = sc.nextLong()) != 0){ // 输入以零结束
long num;
boolean book = true;
String str = null;
for(int i = 2;i <= 16;i++) { // (2-16) 进制
num = decimalToMRadix(n, i); // 将 n 转化成 i 进制
str = String.valueOf(num); // 变成字符串形式
// 以 str 作为构造StringBuffer对象的参数,再反转后转化成字符串
String strreverse = new StringBuffer(str).reverse().toString();
if(str.equals(strreverse)) { // 判断是否是回文
book = false; // 是回文数字
System.out.println(n + " 是以 " + i + " 为基底的回文数字");
}
}
if(book)
System.out.println(n + " 不是回文数字");
}
sc.close();
}
public static long decimalToMRadix(long n, long m) { // 将 n 十进制转化成 m(2-16) 进制
long mradix = 0, r = 0, t = 0;
while(n != 0) {
r = n % m;
n /= m; // 改变 n 值
mradix += (long) (r * Math.pow(10, t));
t++;}
return mradix;
}
}
3.5测试实例及运行结果
四、电话号码
4.1问题描述
辉子最近接到了一个棘手的任务,他们公司有一个电话簿,但是这是一个奇
怪的电话簿,因为它不是用数字记录电话号码,而是用数字键上所对应的字母来
记录电话号码(2-abc,3-def,4-ghi,5-jkl,6-mno,7-pqrs,8-tuv,9-wxyz),电话号
码只有11位。现在你的任务就是帮辉子写一个程序来把这些字母的电话号码转化
成数字的电话号码。
输入:
第一行输入一个正整数T(0 有一行,输入一串字符(字符长度为11)。 输出: 每组输出占一行,输出数字的电话号码。 4.2问题分析 用while循环控制组数,用for循环控制字符长度,将字母和数字在数组中一一对应,用if语句实现。 4.3流程图 4.4功能实现 4.5测试实例及运行结果 #include