实验报告:随意组合、奇怪的比赛、palindrom、电话号码

目 录

一、随意组合

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功能实现

#include

int main(){

int T,i;

char str[11];

scanf("%d",&T);

getchar();

while(T--){

gets(str);

for(i=0;i<11;i++){

if(str[i]=='a'||str[i]=='b'||str[i]=='c')

printf("2");

else if(str[i]=='d'||str[i]=='e'||str[i]=='f')

printf("3");

else if(str[i]=='g'||str[i]=='h'||str[i]=='i')

printf("4");

else if(str[i]=='j'||str[i]=='k'||str[i]=='l')

printf("5");

else if(str[i]=='m'||str[i]=='n'||str[i]=='o')

printf("6");

else if(str[i]=='p'||str[i]=='q'||str[i]=='r'||str[i]=='s')

printf("7");

else if(str[i]=='t'||str[i]=='u'||str[i]=='v')

printf("8");

else if(str[i]=='w'||str[i]=='x'||str[i]=='y'||str[i]=='z')

printf("9");

}

printf("\n");

4.5测试实例及运行结果

             

你可能感兴趣的:(实验报告:随意组合、奇怪的比赛、palindrom、电话号码)