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

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

笔试强训每日一题(四)

计算糖果

题目链接

题目描述

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说明无解。

题目代码

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int aSubb = 0;
  6. int bSubc = 0;
  7. int aSumb = 0;
  8. int bSumc = 0;
  9. cin>>aSubb>>bSubc>>aSumb>>bSumc;
  10. int A = (aSubb+aSumb)/2;
  11. int B1 = A-aSubb;
  12. int B2 = (bSubc+bSumc)/2;
  13. int C = B2-bSubc;
  14. if(B1!=B2)
  15. {
  16. cout<<"No"<<endl;
  17. }
  18. else
  19. {
  20. cout<<A <<" "<<B1<<" "<<C<<endl;
  21. }
  22. return 0;
  23. }

进制转换

题目链接

题目描述

给定一个十进制数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,如果是一个负数,我们需要将他转换成正数再进行转换,转换成正数的同时需要打印符号’-’。

解题代码一

  1. #include<iostream>
  2. #include<stack>
  3. using namespace std;
  4. int main()
  5. {
  6. int num,n;
  7. cin>>num>>n;
  8. int temp = 0;
  9. if(num == 0)
  10. {
  11. cout<<"0"<<endl;
  12. }
  13. //栈保存?十进制以上的如何处理?
  14. stack<int> st;
  15. if(num < 0)
  16. {
  17. num = -num;
  18. cout << '-';
  19. }
  20. while(num)
  21. {
  22. temp = num%n;
  23. num /= n;
  24. st.push(temp);
  25. }
  26. while(!st.empty())
  27. {
  28. int top = st.top();
  29. //判断当top大于等于10时,需要转化成字符打印 10-A 11-B
  30. if(top >= 10)
  31. {
  32. char ch = 'A'-10+top;
  33. cout << ch;
  34. }
  35. else
  36. {
  37. cout << top;
  38. }
  39. st.pop();
  40. }
  41. return 0;
  42. }

解题思路二

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

解题代码二

  1. #include<iostream>
  2. #include<string>
  3. #include<algorithm>
  4. using namespace std;
  5. int main()
  6. {
  7. int m,n;
  8. cin>>m>>n;
  9. string ret,table = "0123456789ABCDEF";
  10. int flag = 1;
  11. if(m == 0)
  12. {
  13. cout<<'0'<<endl;
  14. }
  15. if(m < 0)
  16. {
  17. flag = -1;
  18. m = -m;
  19. }
  20. while(m)
  21. {
  22. ret += table[m%n];
  23. m /= n;
  24. }
  25. if(flag == -1)
  26. {
  27. ret += '-';
  28. }
  29. reverse(ret.begin(),ret.end());
  30. cout<< ret <<endl;
  31. }

相关文章