笔试强训day16(扑克牌大小,完全数计算)

本文解析了五道程序设计竞赛题目,包括选择题和算法题。解答涵盖了类成员访问、虚函数概念、扑克牌大小比较算法及完全数计算等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

第一题-选择题1

第二题-选择题2

第三题-选择题3

第四题-扑克牌大小

第五题-完全数计算


第一题-选择题1

答案:200 10 

思路:

        首先第一行Test obj(5, 10),将a和b初始化为5和10,之后将指针pInt解引用后赋值,由于存在虚函数,所以类的第一个位置存放的是虚函数指针,所以第一个赋值100是给虚函数,第二个赋值200是给b

第二题-选择题2

答案:编译出错 

思路:

        首先B是私有继承A,此时A中的函数在B中是私有的,C是公有继承B,但是C无法访问B中的私有函数

第三题-选择题3

答案:2014 

思路:

        创建子类对象stDerived,用父类指针指向stDerived,输出第一个是调用子类函数,第二个,由于传送的是指针并且,没有调用虚函数,所以最后结果是100*20+4+10

第四题-扑克牌大小

 

思路:

        首先找最大的王炸,如果有直接返回,然后将两手牌分开,计算两手牌数量和第一张牌是什么,比较两手牌的数量,如果相等就比较两手牌的第一张牌大小,最后比较特殊情况四张炸弹大小

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;


string get_max(string & str)
{
    //有大小王直接胜利
    if(str.find("joker JOKER")!=string::npos)
    {
        return "joker JOKER";
    }
    //分开两手牌
    int pos = str.find('-');
    string left_poker = str.substr(0, pos);
    string right_poker = str.substr(pos+1);
    //计算两手牌的数量
    int left_num = count(left_poker.begin(), left_poker.end(), ' ')+1;
    int right_num = count(right_poker.begin(), right_poker.end(), ' ')+1;
    //计算两手牌的第一张牌
    string left_first = left_poker.substr(0, left_poker.find(' '));
    string right_first = right_poker.substr(0, right_poker.find(' '));
    //如果两手牌的数量相等
    if(left_num == right_num)
    {
        string s = "345678910JQKA2jokerJOKER";
        return s.find(left_first) > s.find(right_first) ? left_poker : right_poker;
    }
    //如果是炸弹
    if(left_num == 4)
    {
        return left_poker;
    }
    else if(right_num == 4)
    {
        return right_poker;
    }
    return "ERROR";
}
int main ()
{
    string str;
    while(getline(cin, str))
    {
        string ret = get_max(str);
        cout<<ret<<endl;
    }
    return 0;
}

第五题-完全数计算

 

思路:

        遍历即可

#include<iostream>
using namespace std;

int get_num(int n)
{
    int count = 0, sum = 0;
    for(int i = 2; i <= n; ++i)
    {
        for(int j = 1; j < i; ++j)
        {
            if(i%j == 0)
            {
                sum += j;
            }
        }
        if(sum == i)
        {
            count++;
        }
        sum = 0;
    }
    return count;
}
int main()
{
    int n;
    while(cin>>n)
    {
        int ret = get_num(n);
        cout<<ret<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

penguin_bark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值