笔试强训之每日一题
Posted 小赵小赵福星高照~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔试强训之每日一题相关的知识,希望对你有一定的参考价值。
笔试强训每日一题(四)
文章目录
计算糖果
题目链接
题目描述
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;
以上是关于笔试强训之每日一题的主要内容,如果未能解决你的问题,请参考以下文章