用友笔试——编程题
第一题
第一题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]);
}
}
}