2020年12月青少年C/C++软件编程(三级)等级考试试卷及答案解析

目录

1完美立方

2 不定方程求解

3 分解因数

4 上台阶

5 田忌赛马


1 完美立方

时间限制:1000

内存限制:65536

形如 a3= b3 + c3 + d3的等式被称为完美立方等式。例如 123= 63 + 83 + 103 。

编写一个程序,对任给的正整数 N (N≤100),寻找所有的四元组 (a, b, c, d),使得 a3= b3 + c3 + d3 ,其中 a,b,c,d均大于 11, 小于等于 N,且 b≤c≤d 。

输入

一个正整数 N(N≤100)。

输出

每行输出一个完美立方。输出格式为:

Cube = a, Triple = (b,c,d)

其中 a,b,c,d 所在位置分别用实际求出四元组值代入。

请按照 a 的值,从小到大依次输出。

当两个完美立方等式中 a 的值相同,则 b 值小的优先输出、仍相同则 c 值小的优先输出。

样例输入

24

样例输出

Cube = 6, Triple = (3,4,5)
Cube = 12, Triple = (6,8,10)
Cube = 18, Triple = (2,12,16)
Cube = 18, Triple = (9,12,15)
Cube = 19, Triple = (3,10,18)
Cube = 20, Triple = (7,14,17)
Cube = 24, Triple = (12,16,20)

解析:枚举,上code!

不准直接抄!!!

#include <iostream>
#include <cstdio>
using namespace std;
int main() {

    int N;
    cin >> N;
    for (int a = 2; a <= N; ++a)
    {
        for (int b = 2; b < a; ++b)
        {
            for (int c = b; c < a; ++c)
            {
                for (int d = c; d < a; ++d)
                {
                    if (a * a * a == b * b * b + c * c * c + d * d * d)
                        printf("Cube = %d, Triple = (%d,%d,%d)\n", a, b, c, d);
                }
            }
        }
    }
 
    return 0;
}

2 不定方程求解

时间限制:1000

内存限制:65536

给定正整数a,b,c。求不定方程 ax+by=c 关于未知数x和y的所有非负整数解组数。

输入

一行,包含三个正整数a,b,c,两个整数之间用单个空格隔开。每个数均不大于1000。

输出

一个整数,即不定方程的非负整数解组数。

样例输入

2 3 18

样例输出

4

解析:还是枚举,具体看代码,上code!

不准直接抄!!!

#include<iostream>
using namespace std;
int main(){

    int ans = 0;
    int a, b, c;
    cin >> a >> b >> c;
    for (int i = 0; i <= c; i++) //枚举x的所有可能
    {
        for (int j = 0; j <= c; j++) //枚举y的所有可能
        {
            if (a * i + b * j == c) //判断
                ans++;
        }
    }
    cout << ans; //输出

    return 0;
}

3 分解因数

时间限制:1000

内存限制:65536

给出一个正整数 a ,要求分解成若干个正整数的乘积,即 a = a1· a2 ·a3·...·an,并且 1<a1≤a2≤a3≤...≤ an,问这样的分解的种数有多少。

注意到 a = a 也是一种分解。

输入

第 1 行是测试数据的组数 n(1≤n≤1000) ,后面跟着 n 行输入。每组测试数据占 1 行,包括一个正整数 a (1<a<32768)

输出

n 行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数。

样例输入

2
2
20

样例输出

1
4

解析:dfs深搜,上code!

不准直接抄!!!

#include <iostream>
using namespace std;

int dfs(int x, int now)
{
	int cnt = 1;
	for (int i = now; i * i <= x; i++)
	{
		if (x % i == 0)
			cnt += dfs(x / i, i);
	}
	return cnt;
}

int main() {

	int q;
	cin >> q;
	while (q--)
	{
		int x;
		cin >> x;
		cout << dfs(x, 2);
	}

	return 0;
}

4 上台阶

时间限制:1000

内存限制:65536

楼梯有 n(1≤n≤30) 阶台阶,上楼时可以一步上 1 阶,也可以一步上 2 阶,也可以一步上 3 阶,编程计算共有多少种不同的走法。

输入

输入的每一行包括一组测试数据,即为台阶数 n(1≤n≤30) 。最后一行为0,表示测试结束。

输出

每一行输出对应一行输入的结果,即为走法的数目。

样例输入

1
2
3
4
0

样例输出

1
2
4
7

解析:用数组和循环解决,上code!

不准直接抄!!!

#include<iostream>
using namespace std;

long long a[75];

int main() {

    int n;
    a[1] = 1;
    a[2] = 2;
    a[3] = 4;
    for (int i = 4; i <= 71; i++) 
        a[i] = a[i - 1] + a[i - 2] + a[i - 3];                             
    while (cin >> n && n)
        cout << a[n] << endl; 

    return 0;
}

5 田忌赛马

时间限制:1000

内存限制:6553

在田忌赛马的故事中,孙膑用自己的下等马对战对手的上等马,自己上等马对阵对手的中等马,自己的中等马对阵对手的下等马,从而赢得了胜利。现在即将进行的是N匹马的赛马比赛。双方队伍的马各分为N等。已知只有当我方马的等级比对方马等级高 X 等以上(包含 X )时,我方才可以取得这场比赛的胜利。如果在N场比赛中我方的胜场数大于对方,则我方取得最终的胜利。现在已知对方这 N 场比赛的出战方案,请计算所有令我方最终获胜的出战方案。

输入

第一行两个整数, N 和 X 。0≤X<N≤9 。 第二行 N 个正整数,A1, A2,..., AN 。Ai表示第 i 场比赛对方马的等级,1≤i≤N。等级越高越强。

输出

按字典序输出所有我方最终获胜的方案,每个方案一行。每行是 N 个正整数,两两之间以一个空格分隔,第 i 个数表示我方第 i 场比赛马的等级。

样例输入1

3 1
3 2 1

样例输入2

3 0
3 1 2

样例输出1

1 3 2

样例输出2

1 2 3
1 3 2
2 1 3
3 1 2
3 2 1

解析:dfs,上code!

不准直接抄!!!

#include<iostream>
using namespace std;
int n,x;
int a[15];//对方
bool b[15];//我方可用马匹
int c[15];//我方出场顺序
void dfs(int step){
    if(step>n){//如果都安排完了
        int w=0;//赢得场数
        for(int i=1;i<=n;i++){
            if(c[i]-a[i]>=x){//赢了
                w++;
            }    
        }
        if(w>n/2){//赢超过一半
            for(int i=1;i<=n;i++){
                cout<<c[i]<<" ";//输出
            }
            cout<<endl;//空格
        }
        return;
    }
    for(int i=1;i<=n;i++){//循环按字典序安排马匹
        if(b[i]==0){
            b[i]=1;
            c[step]=i;
            dfs(step+1);
            b[i]=0;
        }
    }
}
int main(){
    cin>>n>>x;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    dfs(1);//深搜
    return 0;
}

作者制作不易,喜欢就点个赞吧!

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值