【算法刷题日记之本手篇】计算糖果与进制转换

举报
未见花闻 发表于 2022/07/31 22:22:09 2022/07/31
【摘要】 本篇文章介绍来自牛客试题广场的两道题题解,分别为【计算糖果】和【进制转换】,展示语言java。

⭐️前面的话⭐️

本篇文章介绍来自牛客试题广场的两道题题解,分别为【计算糖果】和【进制转换】,展示语言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 = A B a = A - B
b = B C b = B - C
c = A + B c = A + B
d = B + C d = B + C

依据上面四个式子,我们不难求出:
A = ( a + c ) / 2 A=(a+c) / 2
B = ( b + d ) / 2 B=(b+d)/2
C = d B C=d - B 或者 C = B b C=B-b

由于我们的糖果是以粒为单位计算的,所以 a + c a+c b + d b+d 必须是偶数,并且求得的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
1

如果得到的余数大于或等于10,需要使用A B C D E F对应替换。
比如将188转换成16进制数:
2
不要忘记考虑负数,对于负数,我们先取它的相反数,然后求相反数的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的个数

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200