牛客笔试题——day04

文章提供了两个编程问题的解决方案。第一个问题是计算A、B、C三人糖果的数量,给定A-B、B-C、A+B、B+C的值。第二个问题是将十进制数转换为指定进制,如16进制,并处理负数情况。提供的Java代码实现了这两个功能,包括表达式求解和进制转换算法。
摘要由CSDN通过智能技术生成

一、计算糖果

1. 题目描述

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

2. 输入描述

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

3. 输出描述

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

4. 示例

输入:
1 -2 3 4
输出:
2 1 3

5. 解题思路

【题目解析】:
A,B,C是三个人手里的糖果数量,我们不知道A,B,C是多少?但是我们知道a=A - B,b= B - C,c= A + B, d=B + C的结果,
这个结果题目是通过输入测试用例给我们的。所以本题本质是一个表达式求解问题。
【解题思路】:
A=(a+c)/2;
B1=(c-a)/2;
C=(d-b)/2;
B2=(b+d)/2
如果B1不等B2则表达式无解,输出No;
否则有解,输出A,B,C。

6. 代码

import java.util.Scanner;

public class calculating_Candy {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        while (sc.hasNextInt()) {
            a = sc.nextInt();
            b = sc.nextInt();
            c = sc.nextInt();
            d = sc.nextInt();
            int A = (a + c) / 2;
            int B = (c - a) / 2;
            int C = (d - b) / 2;
            if (B != (b + d) / 2) {
                System.out.println("No");
            } else {
                System.out.println(A + " " + B + " " + C);
            }
        }
    }
}

二、进制转换

1. 题目描述

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

2. 输入描述

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

3. 输出描述

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

4. 示例

输入:
7 2
输出:
111

5. 解题思路

  1. 定义一个StringBuilder对象sb;
  2. 定义flag,判断正负,初值为false,也就是正数;
  3. 定义一个字符串变量 table,其中包含了十六进制数的字符表示形式;
  4. 判空;
  5. 判断m的正负性,如果为负,flag置为true;
  6. 利用table.charAt()是一个方法,它可以从字符串table中返回指定位置的字符;
  7. 判断如果flag是true,代表m是负数,需要在末尾拼接负号;
  8. 整体reverse转置;
  9. 输出结果。

6. 代码

import java.util.Scanner;
 
public class base_Conversion {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int m=sc.nextInt();
        int n=sc.nextInt();
        //定义一个StringBuilder对象sb
        StringBuilder sb=new StringBuilder();
        //定义flag,判断正负,初值为false,也就是正数
        boolean flag=false;
        //定义一个字符串变量 table,其中包含了十六进制数的字符表示形式
        String table="0123456789ABCDEF";
        //base case
        if(m==0){
            System.out.println("0");
        }
        //判断m的正负性,如果为负,flag置为true
        if(m<0){
            m=-m;
            flag=true;
        }
        //进制转换过程
        while(m!=0){
            //table.charAt()是一个方法,它可以从字符串table中返回指定位置的字符
            sb.append(table.charAt(m%n));
            m=m/n;
        }
        //如果flag是true,代表m是负数,需要在末尾拼接负号
        if(flag==true){
            sb.append("-");
        }
        //整体reverse转置
        sb.reverse();
        System.out.println(sb);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值