用友筆試——編程題
第一題
第一題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]);
}
}
}