您好,登錄后才能下訂單哦!
本篇內容主要講解“有哪些適合Java初學者的簡單編程算法題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“有哪些適合Java初學者的簡單編程算法題”吧!
數學離程序員有多近?
ifelse也好、for循環也罷,代碼可以說就是對數學邏輯的具體實現。所以敲代碼的程序員幾乎就離不開數學,難易不同而已。
那數學不好就寫不了代碼嗎?????不,一樣可以寫代碼,可以寫出更多的CRUD
出來。那你不要總覺得是產品需求簡單所以你的實現過程才變成了增刪改查,往往也是因為你還不具備可擴展、易維護、高性能的代碼實現方案落地能力,才使得你小小年紀寫出了更多的CRUD
!
與一錐子買賣的小作坊相比,大廠和超級大廠更會注重數學能力。
2004年,在硅谷的交通動脈 101 公路上突然出現一塊巨大的廣告牌,上面是一道數學題: {e 的連續數字中最先出現的 10 位質數}
.com。
廣告:這里的 e 是數學常數,自然對數的底數,無限不循環小數。這道題的意思就是,找出 e 中最先出現的 10 位質數,然后可以得出一個網址。進入這個網址會看到 Google 為你出的第二道數學題,成功解鎖這步 Google 會告訴你,我們或許是”志同道合“的人
,你可以將簡歷發到這個郵箱,我們一起做點改變世界的事情。
計算 e 值可以通過泰勒公式推導出來:e^x≈1 + x + x^2/2! + x^3/3! +……+ x^n/n! (1) 推導計算過程還包括埃拉托色尼篩選法(the Sieve of Eratosthenes)
、線性篩選法
的使用。感興趣的小伙伴可以用代碼實現下。
@Test public void test_Fibonacci() { int month = 15; // 15個月 long f1 = 1L, f2 = 1L; long f; for (int i = 3; i < month; i++) { f = f2; f2 = f1 + f2; f1 = f; System.out.println("第" + i + "個月的兔子對數: " + f2); } }
難度:?????
題目:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
邏輯:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)
擴展:斐波那契數列(Fibonacci sequence),又稱黃金分割數列,因數學家萊昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……在數學上,斐波那契數列以如下被以遞推的方法定義:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從 1963 年起出版了以《斐波納契數列季刊》為名的一份數學雜志,用于專門刊載這方面的研究成果。
@Test public void test_Prime() { int count = 0; for (int i = 101; i < 200; i++) { boolean b = true;// 默認此數就素數 for (int j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { b = false; // 此數不是素數 break; } } if (b) { count++; System.out.print(i + " "); } } System.out.println("\n素數的個數:" + count); }
難度:???
題目:判斷101-200之間有多少個素數,并輸出所有素數。
邏輯:判斷素數的方法,用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。
擴展:素數又稱質數,質數的個數是無窮的。歐幾里得的《幾何原本》中有一個經典的證明。它使用了證明常用的方法:反證法。具體證明如下:假設質數只有有限的n個,從小到大依次排列為p1,p2,……,pn,設N=p1×p2×……×pn,那么, 是素數或者不是素數。
@Test public void test_narcissus() { for (int num = 101; num < 1000; num++) { int bbb = num / 100; int bb = (num % 100) / 10; int b = (num % 100) % 10; if ((bbb * bbb * bbb + bb * bb * bb + b * b * b) == num) { System.out.println(num); } } }
難度:????
題目:打印出所有的"水仙花數(narcissus number)",所謂"水仙花數"是指一個三位數,其各位數字立方和等于該數本身。例如:153是一個"水仙花數",因為153=1的三次方+5的三次方+3的三次方。
邏輯:利用for循環控制100-999個數,每個數分解出個位,十位,百位。
擴展:水仙花數(Narcissistic number)也被稱為超完全數字不變數(pluperfect digital invariant, PPDI)、自戀數、自冪數、阿姆斯壯數或阿姆斯特朗數(Armstrong number),水仙花數是指一個 3 位數,它的每個位上的數字的 3次冪之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
@Test public void test_ZhiYinShu() { f(200); } int k = 2; public void f(int n) { while (k <= n) { if (k == n) { System.out.println(n); break; } else if (n > k && n % k == System.out.print(k + "*") n = n / k; f(n); break; } else if (n > k && n % k != k++; f(n); break; } } }
難度:????
題目:將一個正整數分解質因數。例如:輸入90,打印出90=233*5。
邏輯:對n進行分解質因數,應先找到一個最小的質數k,然后按此步驟完成(1)如果這個質數恰等于n,則說明分解質因數的過程已經結束,打印出即可。(2)如果n>k,但n能被k整除,則應打印出k的值,并用n除以k的商,作為新的正整數你n,重復執行第一步。(3)如果n不能被k整除,則用k+1作為k的值,重復執行第一步。
擴展:每個合數都可以寫成幾個質數相乘的形式,其中每個質數都是這個合數的因數,把一個合數用質因數相乘的形式表示出來,叫做分解質因數。如30=2×3×5 。分解質因數只針對合數。
@Test public void test_YangHuiSanJiao(){ int[][] a = new int[10][10]; for (int i = 0; i < 10; i++) { a[i][i] = 1; a[i][0] = 1; } for (int i = 2; i < 10; i++) { for (int j = 1; j < i; j++) { a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; } } for (int i = 0; i < 10; i++) { for (int k = 0; k < 2 * (10 - i) - 1; k++) { System.out.print(" "); } for (int j = 0; j <= i; j++) { System.out.print(a[i][j] + " "); } System.out.println(); } }
難度:????
題目:打印出楊輝三角形
邏輯:楊輝三角形性質:每行數字左右對稱,由1開始逐漸變大,然后變小,回到1。第n行的數字個數為n個。第n行數字和為2^(n-1)。每個數字等于上一行的左右兩個數字之和。可用此性質寫出整個楊輝三角形。第n行的第1個數為1,第二個數為1×(n-1),第三個數為1×(n-1)×(n-2)/2,第四個數為1×(n-1)×(n-2)/2×(n-3)/3…依此類推。
擴展:楊輝三角,是二項式系數在三角形中的一種幾何排列,中國南宋數學家楊輝1261年所著的《詳解九章算法》一書中出現。在歐洲,帕斯卡(1623----1662)在1654年發現這一規律,所以這個表又叫做帕斯卡三角形。帕斯卡的發現比楊輝要遲393年,比賈憲遲600年。
@Test public void test_Prime() { int a = 10, b = 24; int m = division(a, b); int n = a * b / m; System.out.println("最大公約數: " + m); System.out.println("最小公倍數: " + n); } public int division(int x, int y) { int t; if (x < y) { t = x; x = y; y = t; } while (y != 0) { if (x == y) return 1; else { int k = x % y; x = y; y = k; } } return x; }
難度:???
題目:兩個正整數m和n,求其最大公約數和最小公倍數。
邏輯:在循環中,只要除數不等于0,用較大數除以較小的數,將小的一個數作為下一輪循環的大數,取得的余數作為下一輪循環的較小的數,如此循環直到較小的數的值為0,返回較大的數,此數即為最小公約數,最小公倍數為兩數之積除以最小公倍數。
擴展:最大公因數,也稱最大公約數、最大公因子,指兩個或多個整數共有約數中最大的一個。a,b的最大公約數記為(a,b),同樣的,a,b,c的最大公約數記為(a,b,c),多個整數的最大公約數也有同樣的記號。求最大公約數有多種方法,常見的有質因數分解法、短除法、輾轉相除法、更相減損法。與最大公約數相對應的概念是最小公倍數,a,b的最小公倍數記為[a,b]。兩個或多個整數公有的倍數叫做它們的公倍數,其中除0以外最小的一個公倍數就叫做這幾個整數的最小公倍數。整數a,b的最小公倍數記為[a,b],同樣的,a,b,c的最小公倍數記為[a,b,c],多個整數的最小公倍數也有同樣的記號。
@Test public void test_PerfectSquare() { for (long l = 1L; l < 100000; l++) { if (Math.sqrt((l + 100)) % 1 == 0) { if (Math.sqrt((l + 268)) % 1 == 0) { System.out.println(l + "加100是一個完全平方數,再加168又是一個完全平方數"); } } } }
難度:????
題目:一個整數,它加上100后是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
邏輯:在10萬以內判斷,先將該數加上100后再開方,再將該數加上268后再開方,如果開方后的結果滿足如下條件,即是結果。
擴展:完全平方指用一個整數乘以自己例如11,22,3*3等,依此類推。若一個數能表示成某個整數的平方的形式,則稱這個數為完全平方數。完全平方數是非負數,而一個完全平方數的項有兩個。注意不要與完全平方式所混淆。
@Test public void test_Sum() { Scanner s = new Scanner(System.in); int[][] a = new int[3][3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { a[i][j] = s.nextInt(); } } System.out.println("輸入的3 * 3 矩陣是:"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { System.out.print(a[i][j] + " "); } System.out.println(); } int sum = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == j) { sum += a[i][j]; } } } System.out.println("對角線和是 " + sum); }
難度:???
題目:求一個3*3矩陣對角線元素之和
邏輯:利用雙重for循環控制輸入二維數組,再將a[i][i]累加后輸出。
擴展:在一個n階方陣(或是n階行列式)中,從左上角到右下角這一斜線方向上的n 個元素所在的對角線,叫做n 階方陣(或行列式)的主對角線。
@Test public void test_solution() { System.out.println("1到1000的完數有: "); for (int i = 1; i < 1000; i++) { int t = 0; for (int j = 1; j <= i / 2; j++) { if (i % j == 0) { t = t + j; } } if (t == i) { System.out.print(i + " "); } } }
難度:????
題目:一個數如果恰好等于它的因子之和,這個數就稱為 "完數 "。例如6=1+2+3.編程 找出1000以內的所有完數
邏輯:如果p是質數,且2^p-1也是質數,那么(2^p-1)X2^(p-1)便是一個完全數。
擴展:完全數(Perfect number),又稱完美數或完備數,是一些特殊的自然數。它所有的真因子(即除了自身以外的約數)的和(即因子函數),恰好等于它本身。
@Test public void test_asum() { long a = 2, b = 0; Scanner s = new Scanner(System.in); int n = s.nextInt(); int i = 0; long sum = 0; while (i < n) { b = b + a; sum = sum + b; a = a * 10; ++i; } System.out.println("input number: " + n); System.out.println(sum); }
難度:???
題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。
邏輯:定義一個變量b, 賦初值為0;定義一變量sum, 賦初值為0,進入循環后,將a + b 的值賦給b,將sum + b 的值賦給sum;同時,將a 增加十倍, ++ i; 繼續循環;循環結束后,輸出sum 的值。
@Test public void test_AC() { int count = 0; for (int x = 1; x < 5; x++) { for (int y = 1; y < 5; y++) { for (int z = 1; z < 5; z++) { if (x != y && y != z && x != z) { count++; System.out.print(x * 100 + y * 10 + z + " "); if (count % 4 == 0) { System.out.println(); } } } } } System.out.println("共有" + count + "個三位數"); }
難度:????
題目:有1、2、3、4個數字,能組成多少個互不相同且無重復數字的三位數?都是多少?
邏輯:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列后再去掉不滿足條件的排列。
public class SmallToBig { public static void main(String[] args) { SmallToBig fnc = new SmallToBig(); int a, b, c; System.out.println("Input 3 numbers:"); a = fnc.input(); b = fnc.input(); c = fnc.input(); if (a > b) { int t = a; a = b; b = t; } if (a > c) { int t = a; a = c; c = t; } if (b > c) { int t = b; b = c; c = t; } System.out.println(a + " " + b + " " + c); } public int input() { int value = 0; Scanner s = new Scanner(System.in); value = s.nextInt(); return value; } public void compare(int x, int y) {// 此方法沒用 if (x > y) { int t = x; x = y; y = t; } } }
難度:??
題目:輸入三個整數x,y,z,請把這三個數由小到大輸出
邏輯:辦法把最小的數放到x上,先將x與y進行比較,如果x> y則將x與y的值進行交換,然后再用x與z進行比較,如果x> z則將x與z的值進行交換,這樣能使x最小。
public class Monkey { public static void main(String[] args) { int lastdayNum = 1; for (int i = 2; i <= 10; i++) { lastdayNum = (lastdayNum + 1) * 2; } System.out.println("猴子第一天摘了 " + lastdayNum + " 個桃子"); } }
難度:????
題目:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個 第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下 的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。
邏輯:采取逆向思維的方法,從后往前推斷。
public class Compete { static char[] m = { 'a', 'b', 'c' }; static char[] n = { 'x', 'y', 'z' }; public static void main(String[] args) { for (int i = 0; i < m.length; i++) { for (int j = 0; j < n.length; j++) { if (m[i] == 'a' && n[j] == 'x') { continue; } else if (m[i] == 'a' && n[j] == 'y') { continue; } else if ((m[i] == 'c' && n[j] == 'x') || (m[i] == 'c' && n[j] == 'z')) { continue; } else if ((m[i] == 'b' && n[j] == 'z') || (m[i] == 'b' && n[j] == 'y')) { continue; } else System.out.println(m[i] + " vs " + n[j]); } } } }
難度:????
題目:兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊賽手的名單。
public class FenShu { public static void main(String[] args) { int x = 2, y = 1, t; double sum = 0; DecimalFormat df = new DecimalFormat("#0.0000"); for (int i = 1; i <= 20; i++) { sum += (double) x / y; t = y; y = x; x = y + t; System.out.println("第 " + i + " 次相加,和是 " + df.format(sum)); } } }
難度:????
題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。
邏輯:抓住分子與分母的變化規律。
public class JieCheng { static long sum = 0; static long fac = 0; public static void main(String[] args) { long sum = 0; long fac = 1; for (int i = 1; i <= 10; i++) { fac = fac * i; sum += fac; } System.out.println(sum); } }
難度:???
題目:求1+2!+3!+...+20!的和
邏輯:把累加變成了累乘
擴展:階乘是基斯頓·卡曼(Christian Kramp,1760~1826)于 1808 年發明的運算符號,是數學術語。一個正整數的階乘(factorial)是所有小于及等于該數的正整數的積,并且0的階乘為1。自然數n的階乘寫作n!。1808年,基斯頓·卡曼引進這個表示法。
public class HuiWen { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.print("請輸入一個正整數:"); long a = s.nextLong(); String ss = Long.toString(a); char[] ch = ss.toCharArray(); boolean is = true; int j = ch.length; for (int i = 0; i < j / 2; i++) { if (ch[i] != ch[j - i - 1]) { is = false; } } if (is == true) { System.out.println("這是一個回文數"); } else { System.out.println("這不是一個回文數"); } } }
難度:???
題目:一個5位數,判斷它是不是回文數。即12321是回文數,個位與萬位相同,十位與千位相同。
public class ShunXu { public static void main(String[] args) { Scanner s = new Scanner(System.in); int a = s.nextInt(); int b = s.nextInt(); int c = s.nextInt(); if (a < b) { int t = a; a = b; b = t; } if (a < c) { int t = a; a = c; c = t; } if (b < c) { int t = b; b = c; c = t; } System.out.println("從大到小的順序輸出:"); System.out.println(a + " " + b + " " + c); } }
難度:???
題目:輸入3個數a,b,c,按大小順序輸出
public class TiHuan { static final int N = 8; public static void main(String[] args) { int[] a = new int[N]; Scanner s = new Scanner(System.in); int index1 = 0, index2 = 0; System.out.println("please input numbers"); for (int i = 0; i < N; i++) { a[i] = s.nextInt(); System.out.print(a[i] + " "); } int max = a[0], min = a[0]; for (int i = 0; i < a.length; i++) { if (a[i] > max) { max = a[i]; index1 = i; } if (a[i] < min) { min = a[i]; index2 = i; } } if (index1 != 0) { int temp = a[0]; a[0] = a[index1]; a[index1] = temp; } if (index2 != a.length - 1) { int temp = a[a.length - 1]; a[a.length - 1] = a[index2]; a[index2] = temp; } System.out.println("after swop:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } }
難度:??
題目:輸入數組,最大的與第一個元素交換,最小的與最后一個元素交換,輸出數組。
long startTime = System.currentTimeMillis(); int num = 10000000, saveNum = 1, countNum = 0, lastNum = 0; int copyNum = num; while (num != 0) { lastNum = num % 10; num /= 10; if (lastNum == 0) { // 如果是0那么正好是少了一次所以num不加1了 countNum += num * saveNum; } else if (lastNum == 1) { // 如果是1說明當前數內少了一次所以num不加1,而且當前1所在位置 // 有1的個數,就是去除當前1最高位,剩下位數,的個數。 countNum += num * saveNum + copyNum % saveNum + 1; } else { // 如果非1非0.直接用公式計算 // abcd...=(abc+1)*1+(ab+1)*10+(a+1)*100+(1)*1000... countNum += (num + 1) * saveNum; } saveNum *= 10; } System.out.println("1的個數:" + countNum); System.out.println("計算耗時:" + (System.currentTimeMillis() - startTime) + "毫秒");
難度:????
題目:1~n中,1出現的次數。比如:1~10,1出現了兩次。
邏輯:我們能發現這個1的個數在100、1000、10000中是有規則的循環出現的。11、12、13、14或者21、31、41、51,以及單個的1出現。最終可以得出通用公式:abcd...=(abc+1)*1+(ab+1)*10+(a+1)*100+(1)*1000...,abcd代表位數。另外在實現的過程還需要考慮比如不足100等情況,例如98、1232等。
到此,相信大家對“有哪些適合Java初學者的簡單編程算法題”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。