用友笔试编程题

用友笔试——编程题

第一题

第一题SQL题

题面

多表查询题目。

给出用户、订单、商品、店铺四张表。关系为:

店铺,商品(1:n)

店铺,订单(1:n)

商品,订单(1:n)

用户,订单(1:n)

查询结果为:订单编号(code),订单商品总价格(订单数量*商品价格),还有一个不记得了可能是用户姓名,查询条件为订单商品总价格>100,最后的结果按照订单商品总价格降序排序。

select 订单.code,商品.price*订单.number,用户.name
from 订单,用户,商品
where 商品.price*订单.number>100 and 订单.usrid=用户.id and 订单.goodid=good.id
order by 商品.price*订单.number desc;

第二题

题面

给出字符串,用逗号分隔两个数字。求两个数字的乘积。不能直接转化为数字求乘积。

分析

题面很简单,这是一个字符串模拟大数乘法,应该是大数处理。

没有模板,敲的太慢,导致没能提交。

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        // 读入数据,转成int数组
        Scanner in = new Scanner(System.in);
        String s =  in.nextLine();
        String[] nums = s.split(",");
        String num1 = nums[0];
        String num2 = nums[1];
        int len1 = num1.length();
        int len2 = num2.length();
        int[] result = new int[len1+len2];
        int[] array1 = new int[len1];
        int[] array2 = new int[len2];
        for(int i=0;i<len1;i++){
            array1[i] = num1.charAt(i) - '0';
        }
        // carry 进位数,index 辅助数,j第一个操作数的下标
        int carry = 0;
        int index;
        int j;
        for(int i=len2-1;i>=0;i--){
            array2[i] = num2.charAt(i) - '0';
            for(j=len1-1;j>=0;j--){
                // 计算保存到结果数组的下标
                index = len2-1-i+(len1-1-j);
                // 辅助数,临时保存carry
                int temp = carry;
                // 计算carry
                carry = (result[index]+carry+array1[j]*array2[i])/10;
                carry = carry>0?carry:0;
                // 计算两个数的乘积,不包括进位
                result[index] = (result[index]+temp+array1[j]*array2[i])%10;
            }
            // 如果最后还有进位,也要处理,同时把carry置零,因为不存在进位了
            if(carry!=0) {
                result[len2 - 1 - i + (len1 - 1 - j)] = carry;
                carry = 0;
            }
        }
        // 逆序输出,去掉前导零
        boolean zero = true;
        for (int i=result.length-1;i>=0;i--){
            if(zero && result[i]==0)
                continue;
            if(zero)
                zero = false;
            System.out.print(result[i]);
        }


    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值