算法笔记_110:第四届蓝桥杯软件类省赛真题(JAVA软件开发高职高专组部分习题)试题解答...
生活随笔
收集整理的這篇文章主要介紹了
算法笔记_110:第四届蓝桥杯软件类省赛真题(JAVA软件开发高职高专组部分习题)试题解答...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?目錄
1 猜年齡
2 組素數
3 第39級臺階
4 核桃的數量
5 打印十字圖
6 買不到的數目
?
前言:以下試題解答代碼部分僅供參考,若有不當之處,還請路過的同學提醒一下~
1 猜年齡
標題: 猜年齡美國數學家維納(N.Wiener)智力早熟,11歲就上了大學。他曾在1935~1936年應邀來中國清華大學講學。一次,他參加某個重要會議,年輕的臉孔引人注目。于是有人詢問他的年齡,他回答說:“我年齡的立方是個4位數。我年齡的4次方是個6位數。這10個數字正好包含了從0到9這10個數字,每個都恰好出現1次。”請你推算一下,他當時到底有多年輕。通過瀏覽器,直接提交他那時的年齡數字。注意:不要提交解答過程,或其它的說明文字。18 直接枚舉出所有可能的4位數,和6位數情況下的x,然后直接看結果,輕易知道是18。 下面程序運行結果: x = 18, x^3 = 5832, x^4 = 104976 x = 19, x^3 = 6859, x^4 = 130321 x = 20, x^3 = 8000, x^4 = 160000 x = 21, x^3 = 9261, x^4 = 194481?
public class Main {public void printResult() {for(int x = 1;x <= 100;x++) {int a = x * x * x;int b = x * x * x * x;if(a > 999 && a < 10000 && b > 99999 && b < 1000000) {System.out.println("x = "+x+", x^3 = "+a+", x^4 = "+b);}}}public static void main(String[] args) {Main test = new Main();test.printResult();} }?
?
?
2 組素數
標題: 組素數素數就是不能再進行等分的數。比如:2 3 5 7 11 等。9 = 3 * 3 說明它可以3等分,因而不是素數。我們國家在1949年建國。如果只給你 1 9 4 9 這4個數字卡片,可以隨意擺放它們的先后順序(但卡片不能倒著擺放啊,我們不是在腦筋急轉彎!),那么,你能組成多少個4位的素數呢?比如:1949,4919 都符合要求。請你提交:能組成的4位素數的個數,不要羅列這些素數!!注意:不要提交解答過程,或其它的輔助說明文字。6?
import java.util.ArrayList;public class Main {public ArrayList<Integer> list = new ArrayList<Integer>();public static int count = 0;public boolean check(int[] A) {int num = A[0]*1000 + A[1]*100 + A[2]*10 + A[3];for(int i = 2;i < num;i++) {if(num % i == 0)return false;if(i > num / 2)break;}if(list.contains(num)) return false;else {list.add(num);}return true;}public void swap(int[] A, int a, int b) {int temp = A[a];A[a] = A[b];A[b] = temp;}public void dfs(int[] A, int step) {if(step == A.length) {if(check(A)) {count++;for(int i = 0;i < 4;i++)System.out.print(A[i]);System.out.println();return;}} else {for(int i = step;i < A.length;i++) {swap(A, i, step);dfs(A, step + 1);swap(A, i, step);}}return;}public static void main(String[] args) {Main test = new Main();int[] A = {1,9,4,9};test.dfs(A, 0);System.out.println("最終結果:"+count);} }?
?
?
?
3 第39級臺階
標題: 第39級臺階小明剛剛看完電影《第39級臺階》,離開電影院的時候,他數了數禮堂前的臺階數,恰好是39級!站在臺階前,他突然又想著一個問題:如果我每一步只能邁上1個或2個臺階。先邁左腳,然后左右交替,最后一步是邁右腳,也就是說一共要走偶數步。那么,上完39級臺階,有多少種不同的上法呢?請你利用計算機的優勢,幫助小明尋找答案。要求提交的是一個整數。 注意:不要提交解答過程,或其它的輔助說明文字。51167078?
public class Main {public static int count = 0;public void dfs(int sum, int step) {if(sum > 39)return;if(sum == 39) {if(step % 2 == 0) //題意規定,第一步為左腳,最后一步為右腳count++;return;} dfs(sum + 1, step + 1);dfs(sum + 2, step + 1);return;}public static void main(String[] args) {Main test = new Main();test.dfs(0, 0);System.out.println(count);} }?
public class Main1 {public static void main(String[] args) {int[][] dp = new int[39][2];dp[0][0] = 1; //第一步必須邁左腳(題意規定),左腳到達第一個臺階只有1種可能dp[0][1] = 0; //第一步不能邁右腳,右腳無法到達一個臺階dp[1][0] = 1; //左腳到達第二個臺階只有一種可能dp[1][1] = 1; //右腳到達第二個臺階也只有一種可能for(int i = 2;i < 39;i++) {dp[i][0] = dp[i - 1][1] + dp[i - 2][1]; dp[i][1] = dp[i - 1][0] + dp[i - 2][0];}System.out.println(dp[38][1]); //最終到達39個臺階,必須是右腳 } }?
?
?
4 核桃的數量
標題:核桃的數量小張是軟件項目經理,他帶領3個開發組。工期緊,今天都在加班呢。為鼓舞士氣,小張打算給每個組發一袋核桃(據傳言能補腦)。他的要求是:1. 各組的核桃數量必須相同2. 各組內必須能平分核桃(當然是不能打碎的)3. 盡量提供滿足1,2條件的最小數量(節約鬧革命嘛)程序從標準輸入讀入: a b c a,b,c都是正整數,表示每個組正在加班的人數,用空格分開(a,b,c<30)程序輸出: 一個正整數,表示每袋核桃的數量。例如: 用戶輸入: 2 4 5程序輸出: 20再例如: 用戶輸入: 3 1 1程序輸出: 3資源約定: 峰值內存消耗(含虛擬機) < 64M CPU消耗 < 1000ms請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。 注意:不要使用package語句。不要使用jdk1.6及以上版本的特性。 注意:主類的名字必須是:Main,否則按無效代碼處理。?
import java.util.Scanner;public class Main {//求取a和b的最大公約數public int gcd(int a, int b) {if(b == 0)return a;return gcd(b, a % b);}public void printResult(int a, int b, int c) {int a1 = gcd(a, b); int lcm1 = a * b / a1; //a和b的最小公倍數int a2 = gcd(lcm1, c);int lcm2 = lcm1 * c / a2; //a、b、c的最小公倍數 System.out.println(lcm2);}public static void main(String[] args) {Main test = new Main();Scanner in = new Scanner(System.in);int a = in.nextInt();int b = in.nextInt();int c = in.nextInt();test.printResult(a, b, c);} }?
?
?
?
5 打印十字圖
標題:打印十字圖小明為某機構設計了一個十字型的徽標(并非紅十字會啊),如下所示(可參見p1.jpg)$$$$$$$$$$$$$$ $$$$ $$$$$$$$$ $$$$ $ $ $$ $$$ $$$$$ $$$ $$ $ $ $ $ $$ $ $$$ $ $$$ $ $$ $ $ $ $ $ $$ $ $ $$$$$ $ $ $$ $ $ $ $ $ $$ $ $$$ $ $$$ $ $$ $ $ $ $ $$ $$$ $$$$$ $$$ $$ $ $ $$$$ $$$$$$$$$ $$$$ $$$$$$$$$$$$$$對方同時也需要在電腦dos窗口中以字符的形式輸出該標志,并能任意控制層數。為了能準確比對空白的數量,程序要求對行中的空白以句點(.)代替。輸入格式: 一個正整數 n (n<30) 表示要求打印圖形的層數輸出: 對應包圍層數的該標志。例如: 用戶輸入: 1 程序應該輸出: ..$$$$$.. ..$...$.. $$$.$.$$$ $...$...$ $.$$$$$.$ $...$...$ $$$.$.$$$ ..$...$.. ..$$$$$..再例如: 用戶輸入: 3 程序應該輸出: ..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$$ $...$.......$...$ $.$$$.$$$$$.$$$.$ $.$...$...$...$.$ $.$.$$$.$.$$$.$.$ $.$.$...$...$.$.$ $.$.$.$$$$$.$.$.$ $.$.$...$...$.$.$ $.$.$$$.$.$$$.$.$ $.$...$...$...$.$ $.$$$.$$$$$.$$$.$ $...$.......$...$ $$$.$$$$$$$$$.$$$ ..$...........$.. ..$$$$$$$$$$$$$..請仔細觀察樣例,尤其要注意句點的數量和輸出位置。資源約定: 峰值內存消耗(含虛擬機) < 64M CPU消耗 < 1000ms請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。 注意:不要使用package語句。不要使用jdk1.6及以上版本的特性。 注意:主類的名字必須是:Main,否則按無效代碼處理。?
import java.util.Scanner;public class Main {public void printResult(int n) {int len = 5 + 4 * n; //易知,輸入為n輸出的圖像一定為一個正方形,且邊長為lenchar[][] A = new char[len][len]; //用于存放最終輸出結果int x = len / 2; //輸出圖像正中間的十字圖像的正中間一點的坐標為(x, x)for(int i = 0;i < len;i++)for(int j = 0;j < len;j++)A[i][j] = '.'; //初始化為'.',后續涂'$'//首先,涂圖像正中間的十字for(int i = x - 2;i <= x + 2;i++) {A[i][x] = '$'; //涂十字的一豎A[x][i] = '$'; //涂十字的一橫 }//接著,涂正中間十字由內向外的十字圈,這里先圖十字圈的上下一橫和左右一豎for(int i = 0;i < n;i++) { //i表示當前涂第i個十字圈(由內向外)for(int j = x - (2 + 2*i);j <= x + (2 + 2*i);j++) {A[x - (4 + 2*i)][j] = '$'; //涂十字圈的上面一橫A[x + (4 + 2*i)][j] = '$'; //涂十字圈的下面一橫A[j][x - (4 + 2*i)] = '$'; //涂十字圈的左邊一豎A[j][x + (4 + 2*i)] = '$'; //涂十字圈的右邊一豎 }}//最后,涂十字圈的四個L形狀的圖形,根據對稱填涂(由里向外)for(int i = 0;i < n;i++) {//填十字圈左上方的L形狀的圖形,共三個點A[x - (2 + 2*i)][x - (2 + 2*i)] = '$';A[x - (2 + 2*i)][x - (2 + 2*i) - 1] = '$';A[x - (2 + 2*i) - 1][x - (2 + 2*i)] = '$';//填右上方的L形狀圖形A[x - (2 + 2*i)][x + (2 + 2*i)] = '$';A[x - (2 + 2*i)][x + (2 + 2*i) + 1] = '$';A[x - (2 + 2*i) - 1][x + (2 + 2*i)] = '$';//填左下方的L形狀的圖形A[x + (2 + 2*i)][x - (2 + 2*i)] = '$';A[x + (2 + 2*i)][x - (2 + 2*i) - 1] = '$';A[x + (2 + 2*i) + 1][x - (2 + 2*i)] = '$';//填右下方的L形狀的圖形A[x + (2 + 2*i)][x + (2 + 2*i)] = '$';A[x + (2 + 2*i)][x + (2 + 2*i) + 1] = '$';A[x + (2 + 2*i) + 1][x + (2 + 2*i)] = '$';}//打印最終結果for(int i = 0;i < len;i++) {for(int j = 0;j < len;j++) {System.out.print(A[i][j]);}System.out.println();}return;}public static void main(String[] args) {Main test = new Main();Scanner in = new Scanner(System.in);int n = in.nextInt();test.printResult(n);} }?
?
?
6 買不到的數目
標題:買不到的數目小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大于17的任何數字都可以用4和7組合出來。本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。輸入: 兩個正整數,表示每種包裝中糖的顆數(都不多于1000)要求輸出: 一個正整數,表示最大不能買到的糖數不需要考慮無解的情況例如: 用戶輸入: 4 7 程序應該輸出: 17再例如: 用戶輸入: 3 5 程序應該輸出: 7資源約定: 峰值內存消耗(含虛擬機) < 64M CPU消耗 < 3000ms請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。 注意:不要使用package語句。不要使用jdk1.6及以上版本的特性。 注意:主類的名字必須是:Main,否則按無效代碼處理。?
import java.util.Scanner;public class Main {public static int max = 0;public void printResult(int a, int b) {for(int i = 1;i <= a * b;i++) {int lenA = i / a;int lenB = i / b;boolean judge = true;for(int p = 0;p <= lenA;p++) {for(int q = 0;q <= lenB;q++) {if(p * a + q * b == i) {judge = false;break;}}if(judge == false)break;}if(judge == true) {if(max < i)max = i;}}System.out.println(max);}public static void main(String[] args) {Main test = new Main();Scanner in = new Scanner(System.in);int a = in.nextInt();int b = in.nextInt();test.printResult(a, b);} }?
總結
以上是生活随笔為你收集整理的算法笔记_110:第四届蓝桥杯软件类省赛真题(JAVA软件开发高职高专组部分习题)试题解答...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如来分形 大圣败北 ——如来会分形的取证
- 下一篇: 《剑指Offer》51. 二叉搜索树的第