笔试强训之每日一题(四)

x33g5p2x  于2022-02-07 转载在 其他  
字(2.2k)|赞(0)|评价(0)|浏览(212)

笔试强训每日一题(四)

计算糖果

题目链接

题目描述

A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:
A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.
现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。

输入描述

输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。 范围均在-30到30之间(闭区间)。

输出描述

输出为一行,如果存在满足的整数A,B,C则按顺序输出A,B,C,用空格隔开,行末无空格。 如果不存在这样的整数A,B,C,则输出No

题目解析

这道题其实是一个数学题

A - B = aSubb 1式

B - C = bSubc 2式

A + B = aSumb 3式

B + C = bSumc 4式

1式联立3式可得 A = (aSubb+aSumb)/2,B1 = A-aSubb

2式联立4式可得B2 = (bSubc+bSumc)/2,C = B2-bSubc

如果B1==B2说明有解,B1!=B2说明无解。

题目代码

#include<iostream>
using namespace std;
int main()
{
    int aSubb = 0;
    int bSubc = 0;
    int aSumb = 0;
    int bSumc = 0;
    cin>>aSubb>>bSubc>>aSumb>>bSumc;
    int A = (aSubb+aSumb)/2;
    int B1 = A-aSubb;
    int B2 = (bSubc+bSumc)/2;
    int C = B2-bSubc;
    if(B1!=B2)
    {
        cout<<"No"<<endl;
    }
    else
    {
        cout<<A <<" "<<B1<<" "<<C<<endl;
    }
    return 0;
}

进制转换

题目链接

题目描述

给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数

输入描述

输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。

输出描述

为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)

解题思路一

首先进制转换的核心点是,需要知道一个十进制怎么转任意进制,就是用这个十进制去除进制,余数保存起来,所得商再继续进行取余,直到商为0为止,此时将余数倒着写就是转换过来的进制数:temp = num%n;num /= n;

因为栈具有先进后出的特性,我们可以用栈来保存余数,最后将栈元素出栈即可,需要注意的是判断当top大于等于10时,需要转化成字符打印,转换方法就是’A’-10+top,这里还需要注意的是需要判断如果输入的是0,我们直接输出0,如果是一个负数,我们需要将他转换成正数再进行转换,转换成正数的同时需要打印符号’-’。

解题代码一

#include<iostream>
#include<stack>
using namespace std;
int main()
{
    int num,n;
    cin>>num>>n;
    int temp = 0;
    if(num == 0)
    {
        cout<<"0"<<endl;
    }
    //栈保存?十进制以上的如何处理?
    stack<int> st;
    if(num < 0)
    {
        num = -num;
        cout << '-';
    }
    while(num)
    {
        temp = num%n;
        num /= n;
        st.push(temp);
    }
    while(!st.empty())
    {
        int top = st.top();
        //判断当top大于等于10时,需要转化成字符打印 10-A 11-B
        if(top >= 10)
        {
            char ch = 'A'-10+top;
            cout << ch;
        }
        else
        {
            cout << top;
        }
        st.pop();
    }
    return 0;
}

解题思路二

我们可以将0123456789ABCDEF保存在一个table当中,再创建一个string对象ret来保存余数,这里需要注意保存时余数映射到table的下标位置就是对应的字符:ret += table[m%n],完成后将ret进行逆置即可,这里还多了一个标志位进行正负的判断,余数保存完后,判断正负,如果为负将’-'加上去,其他细节和方法一类似

解题代码二

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    int m,n;
    cin>>m>>n;
    string ret,table = "0123456789ABCDEF";
    int flag = 1;
    if(m == 0)
    {
        cout<<'0'<<endl;
    }
    if(m < 0)
    {
        flag = -1;
        m = -m;
    }
    while(m)
    {
        ret += table[m%n];
        m /= n;
    }
    if(flag == -1)
    {
        ret += '-';
    }
    reverse(ret.begin(),ret.end());
    cout<< ret <<endl;
}

相关文章