【算法刷题日记之本手篇】计算糖果与进制转换
⭐️前面的话⭐️
本篇文章介绍来自牛客试题广场的两道题题解,分别为【计算糖果】和【进制转换】,展示语言java。
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创!
📆首发时间:🌴2022年7月31日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《数据结构与算法》,📚《算法导论》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
⭐️计算糖果⭐️
🔐题目详情
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
示例1
输入:
1 -2 3 4
输出:
2 1 3
题目链接:计算糖果
💡解题思路
基本思路: 数学推理
解题思路:
题目的输入给了我们4个数,我们不妨将这几个数分别记为a b c d
,A B C三个人的糖果数就记为A B C
,根据题目意思我们可以得到以下几个表达式:
依据上面四个式子,我们不难求出:
或者
由于我们的糖果是以粒为单位计算的,所以
与
必须是偶数,并且求得的A B C
必须全部是非负数。
🔑源代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//A-B
int a = sc.nextInt();
//B-C
int b = sc.nextInt();
//A+B
int c = sc.nextInt();
//B+C
int d = sc.nextInt();
// a + c = 2 * A
int A = (a + c) / 2;
//b + d = 2 * B
int B = (b + d) / 2;
//C = d - B or C = B - b
int C = d - B;
if ((a + c) % 2 == 0 && (b + d) % 2 == 0 && A >= 0 && B >= 0 && C >= 0) {
//如果a + c与b + d都能被2整除,并且A B C均大于或等于0 则存在A B C
System.out.println(A + " " + B + " " + C);
} else {
//否则不存在,输出No
System.out.println("No");
}
}
}
🌱总结
本题本质上是数学问题,代码层面只需要使用表达式,分支语句即可。
⭐️进制转换⭐️
🔐题目详情
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
示例1
输入:
7 2
输出:
111
题目链接:进制转换
💡解题思路
基本思路: 数学
解题思路:
不妨设十进制数为m
, 需要将m
转换为n
进制数,我们可以利用辗转相除法得到每一次除以n
的余数,将得到的余数从后往前拼装得到的就是n
进制数,注意我们按照辗转相除法顺序拼接字符串得到的是逆序的n
进制字符串,所以输出时需要逆置一下。
比如:m=32,n=2
如果得到的余数大于或等于10
,需要使用A B C D E F
对应替换。
比如将188
转换成16
进制数:
不要忘记考虑负数,对于负数,我们先取它的相反数,然后求相反数的n
进制数,最后在最前面加上一个-
就可以了,由于我们按照辗转相除法拼接得到的n
进制字符串是与目标n
进制字符串顺序是相反的,因此我们求出“逆序”n
进制字符串后,再加上一个-
在字符串末尾,再逆置一下就能得到正序的字符串了。
🔑源代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
char[] ds = {'A', 'B', 'C', 'D', 'E', 'F'};
//辗转相除法
int k = m;
StringBuilder ans = new StringBuilder();
if (m == 0) {
ans.append(0);
}
//保证k为正
k = k < 0 ? -k : k;
while (k > 0) {
int ret = k % n;
if (ret < 10) {
ans.append(ret);
} else {
ans.append(ds[ret % 10]);
}
k /= n;
}
//考虑负数
if (m < 0) {
ans.append('-');
}
//此时构造的进制转换字符串是顺序是逆着的,需要进行逆序
ans.reverse();
System.out.println(ans);
}
}
🌱总结
本题属于数学模拟题,重点是知道使用辗转相除法求余数,进行进制的转换。
类似题:
504. 七进制数
剑指 Offer 15. 二进制中1的个数
- 点赞
- 收藏
- 关注作者
评论(0)