2019-1-2作業練習
1、一個人很倒黴,不小心打碎了一位婦女的一籃子雞蛋。為了賠償便詢問籃子裡有多少雞蛋。那婦女說,她也不清楚,只記得每次拿兩個則剩一個,每次拿3個則剩2個,每次拿5個則剩4個,若每個雞蛋1元,請你幫忙程式設計,計算最少應賠多少錢? 要求:用迴圈語句實現,直接打印出結果不給分。
package com.java1_2; public class JiDan { public static void main(String[] args) { /*int a = 0; int b = 0; int c = 0;*/ for(int i=1;;i++){ if((i%2==1)&&(i%3==2)&&(i%5==4)) { System.out.println("藍子裡總共有"+i+"個雞蛋,總共要賠償"+i+"元。"); break; } } } }
結果為:
2、從鍵盤接收一個整數N,統計出1~N之間能被7整除的整數的個數,以及這些能被7整除的數的和。
package com.java1_2; import java.util.Scanner; public class LianXi2 { public static void main(String[] args) { Scanner cxj = new Scanner(System.in); System.out.print("請輸入整數:"); int a = cxj.nextInt(); int count = 0; int sum = 0; for(int i=1;i<=a;i++) { if(i%7==0) { count++; sum += i; } } System.out.println("1~"+a+"之間能被7整除的有"+count+"個"); System.out.println("這些數之和為:"+sum); } }
結果示例:
3、古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子對數為多少?
程式分析:兔子的規律為數列1,1,2,3,5,8,13,21....
package com.java1_2; import java.util.Scanner; public class LianXi3 { public static void main(String[] args) { Scanner cxj = new Scanner(System.in); System.out.println("請輸入您要檢視的月份:"); int yue = cxj.nextInt(); int num1 = 1; int num2 = 1; int sum = 0; for(int i=3;i<=yue;i++) { sum = num1 + num2; num1 = num2; num2 = sum; } System.out.println("該月兔子有"+sum+"對"); } }
結果示例:
4、一個籠子有35個頭,94只腳,問雞和兔各有多少?
解題:數學方法:設雞i只,兔j只,方程:i + j = 35 ; 2 * i + 4 * j = 94。
解題思路:雞和兔加起來35只,所以算每一種可能的腳的個數,符合就輸出就可以了
package com.java1_2; //雞兔同籠35只,94只腳,求雞有幾隻,兔有幾隻 public class LianXi4 { public static void main(String[] args) { /*for(int i=1;i<35;i++) {//i為兔的個數 for(int j=1;j<35;j++) {//j為雞的個數 if((i+j)==35&&(i*4+j*2==94)) { System.out.println("雞有"+j+"只,"+"兔有"+i+"只"); } } }*/ int a=0; for(int i=4;i<94;i++) {//i為兔的腳數 if((i%4==0)&&i/4<35) { a = 35 - i; if(i*4+a*2==94) { System.out.println("雞有"+a+"只,"+"兔有"+i+"只"); } } } } }
結果為:
5、馬克思手稿中有一道趣味數學題:有30個人,其中有男人、女人和小孩,在一家飯館裡吃飯共花了50先令,每個男人各花3先令,每個女人各花2先令,每個小孩各花1先令,問男人、女人和小孩各有幾人?
package com.java1_2; //以男人個數作為外迴圈,以女人個數作為內迴圈,輸出所有可能的情況 //i代表男人個數、j代表女人個數 public class LianXi5 { public static void main(String[] args) { for(int i=1;i<30;i++) { for(int j=1;j<30;j++) { if((i+j)<30&&(i*3+j*2)<50) { if((i*3+j*2+(30-i-j))==50) { System.out.println("男人有:"+i+"個,女人有:"+j+"個,"+"小孩有"+(30-i-j)+"個"); } } } } } }
所有可能的結果為:
6、判斷101-200之間有多少個素數,並輸出所有素數。
程式分析:* 素數是:只能被1或本身整除的數,如:2,3,5,7,11,131...
package com.java1_2; public class LianXi6 { public static void main(String[] args) { for(int i=101;i<=200;i++) { boolean shu = true; for(int j=2;j<i;j++) { if(i%j==0) { shu = false;//如果i能被比i小的數整數就不為素數 break; } } if(shu){ System.out.println(i); } } } }
結果:
7、打印出所有的"水仙花數",所謂"水仙花數"是指一個三位數,其各位數字立方和等於該數本身。例如:153是一個"水仙花數",因為153=1的三次方+5的三次方+3的三次方。
程式分析:利用for迴圈控制100-999個數,每個數分解出個位,十位,百位。
package com.java1_2; //水仙花數 public class LianXi7 { public static void main(String[] args) { int a = 0; int b = 0; int c = 0; for(int i=100;i<1000;i++) { a = i%10;//個位數 b = i/10%10;//十位數 c = i/100;//百位數 if(a*a*a+b*b*b+c*c*c==i) { System.out.println(i); } } } }
結果:
8、將一個正整數分解質因數。比如:輸入90,打印出90=2*3*3*5。
package com.java1_2; import java.util.Scanner; public class LianXi8 { public static void main(String[] args) { Scanner cxj = new Scanner(System.in); System.out.println("請輸入一個整數:"); int n = cxj.nextInt(); System.out.print(n+"的質因數是:"+n+"="); for(int i=2;i<n;i++) { if(n%i==0) { System.out.print(i+"*"); n = n/i; i--;//此處把i自減,避免出現相除後n的值還是偶數的情況 } } System.out.println(n); } }
結果示例:
9、題目:利用條件運算子的巢狀來完畢此題:學習成績> =90分的同學用A表示,60-89分之間的用B表示,60分下面的用C表示。
package com.java1_2; import java.util.Scanner; public class LianXi9 { public static void main(String[] args) { Scanner cxj = new Scanner(System.in); System.out.println("請輸入學生的成績:"); double score = cxj.nextDouble(); String a = score>=90?"A":(score>=60)?"B":"C"; System.out.println(a); } }
結果示例:
10、題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
package com.java1_2; import java.util.Scanner; public class LianXi10 { public static void main(String[] args) { Scanner cxj = new Scanner(System.in); System.out.println("請輸入兩個整數:"); int a = cxj.nextInt(); int b = cxj.nextInt(); int num1 = a; int num2 = b; int k = 1; int c = a<b?a:b; for(int i=2;i<c;i++) { if((a%i==0)&&(b%i==0)) { k *= i; a /= i; b /= i; i--; } } System.out.println("最小公約數是:"+k); int d = num1/k; int e = num2/k; System.out.println("最小公倍數是:"+k*d*e); } }
結果示例:
11、求s=a+aa+aaa+aaaa+aa...a的值。當中a是一個數字。
package com.java1_2; import java.util.Scanner; public class LianXi11 { public static void main(String[] args) { int sum = 0; int b = 1; Scanner cxj = new Scanner(System.in); System.out.println("請輸入一個正整數:"); int a = cxj.nextInt(); for(int i = 1;i<=a;i++) { b *= a; sum += b; } System.out.println(sum); } }
結果示例:
12、題目:一個數假設恰好等於它的因子之和,這個數就稱為 "完數 "。
package com.java1_2; //求10000以內所有的完數 public class LianXi12 { public static void main(String[] args) { int sum; int i,j; System.out.print("10000以內的完數有:"); for(i=2;i<=10000;i++) { sum = 0;//對sum進行初始賦值,重新進入迴圈 for(j=1;j<i;j++) { if(i%j==0) { sum += j; } } if(sum==i) { System.out.print(sum+" "); } } } }
結果:
13、題目:一球從100米高度自由落下,每次落地後反跳回原高度的一半,再落下,求它在第10次落地時,共經過多少米?第10次反彈多高?
package com.java1_2; public class LianXi13 { public static void main(String[] args) { double a = 100;//起始高度100米 double sum = 0; int n = 10;//落地次數 for(int i=1;i<=n;i++) { a = a/2;//落地後下一次跳起的高度為原高度的一半 sum = sum + a*3; //每次落下後跳起,這個過程的路程剛好為落地後跳起高度的3倍 } System.out.println("第10次落地後跳起的高度是:"+a); System.out.println("第10次落地時共經過了"+(sum-a)+"米"); //sum計算從第1次到第n次落地後跳起的高度,因些若要第n次落地之前的路程,則減去第n落地後再跳起的高度 } }
結果為:
14、題目:有1、2、3、4四個數字。能組成多少個互不同樣且無反覆數字的三位數?都是多少?
package com.java1_2; public class LianXi14 { public static void main(String[] args) { int sum = 0; for(int i=1;i<=4;i++) { for(int j=1;j<=4;j++) { if(i!=j) { for(int k=1;k<=4;k++) { sum = i*100 + j*10 + k; if((i!=k)&&(j!=k)) { System.out.println(sum); continue; } } } } } } }
結果為:
15、題目:一個整數,它加上100後是一個全然平方數,再加上168又是一個全然平方數,請問該數是多少?
package com.java1_2; public class LianXi15 { public static void main(String[] args) { for(int i=1;i<10000;i++) { int a = i+100; for(int j=1;j<a;j++) { if((a%j==0)&&(j*j==a)) {//先找出10000以內加上100後還是完全平方數的數 int b = a + 168; for(int k=1;k<b;k++) { if((b%k==0)&&(k*k==b)) {//再篩選出再加168後還是完全平方數的數 System.out.println(i); } } } } } } }
結果示例:
16、題目:輸入某年某月某日,推斷這一天是這一年的第幾天?
package com.java1_2; import java.util.Scanner; public class LianXi16 { public static void main(String[] args) { Scanner cxj = new Scanner(System.in); int[] yearday = {31,28,31,30,31,30,31,31,30,31,30,31}; int sum = 0; System.out.print("請輸入您要查詢的年份:"); int year = cxj.nextInt(); System.out.print("請輸入您要查詢的月份:"); int moon = cxj.nextInt(); System.out.print("請輸入您要查詢的號數:"); int day = cxj.nextInt(); //判斷該年份是否為閏年,如果是2月份當月為29天 if(((year%4==0)&&(year%100!=0))||(year%400==0)) { yearday[1] = 29; } //把要查詢月份之前的所有月份天數相加 for(int i=0;i<moon-1;i++) { sum += yearday[i]; } System.out.println("這一天在當年內是第"+(sum+day)+"天!");//輸出時再加上查詢當月的日期 } }
結果示例:
17、題目:輸入三個整數x,y,z。請把這三個數由小到大輸出。
package com.java1_2; import java.util.Scanner; //輸入三個整數x,y,z。請把這三個數由小到大輸出。 public class LianXi17 { public static void main(String[] args) { Scanner cxj = new Scanner(System.in); System.out.println("請輸入三個整數:"); int[] shu = new int[3]; for(int i=0;i<shu.length;i++) { shu[i] = cxj.nextInt(); } for(int i=0;i<shu.length-1;i++) { for(int j=0;j<shu.length-1-i;j++) { if(shu[j]>shu[j+1]) { int temp = shu[j]; shu[j] = shu[j+1]; shu[j+1] = temp; } } } System.out.print("排序後結果為:"); for(int shu1:shu) { System.out.print(shu1+" "); } } }
結果示例:
18、題目:猴子吃桃問題:猴子第一天摘下若干個桃子。當即吃了一半,還不癮,又多吃了一個;第二天早上又將剩下的桃子吃掉一半,又多吃了一個;以後每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,見僅僅剩下一個桃子了。求第一天共摘了多少。
package com.java1_2; public class LianXi18 { public static void main(String[] args) { for(int i=10;i<1000000000;i++) { int a = i; for(int j=1;j<=10;j++) { a = (a/2 - 1);//每一次吃完後剩下就是前一次的總量的一半再減去一個 } if(a==1) { System.out.println("第一天總共摘了"+i+"個桃子."); break; } } } }
結果為:
19、題目:有一分數序列:2/1,3/2,5/3,8/5。13/8。21/13...求出這個數列的前20項之和。
package com.java1_2; public class LianXi19 { public static void main(String[] args) { double sum = 0; int a = 1; int b = 2; for(int i=1;i<=20;i++) { sum += b*1.0/a; int temp = b; b = a + b;//下一個分數的分子是前一個分數的分子加上分母 a = temp; } System.out.println("前20項之和是:"+sum); } }
結果為:
20、題目:求1+2!+3!+...+20!的和
package com.java1_2; public class LianXi20 { public static void main(String[] args) { long sum = 1; long sum1 = 0; for(int i=1;i<=20;i++) { for(int j=1;j<=i;j++) { sum *= j;//求出1到20各自的階乘 sum1 += sum;//把1到20的階乘相加 } } System.out.println("1!+2!+3!+....+20!="+sum1); } }
結果為:
21、題目:有5個人坐在一起。問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人。說比第一個人大兩歲。最後問第一個人。他說是10歲。請問第五個人多大?
package com.java1_2; //第五個人年齡=第四個人+2=第三個人+2+2=第二個人+2+2+2=第一個人+2+2+2+2;即第五個人=第一個人加了(5-1)次2 public class LianXi21 { public static void main(String[] args) { int age = 10;//第一個人10歲 for(int i=1;i<5;i++) { age = age + 2; } System.out.println("第五個人的年齡是:"+age); } }
結果為:
22、題目:海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子平均分為五份,多了一個,這隻猴子把多的一個扔入海中,拿走了一份。第二隻猴子把剩下的桃子又平均分成五份,又多了一個。它相同把多的一個扔入海中,拿走了一份,第三、第四、第五隻猴子都是這樣做的,問海灘上原來最少有多少個桃子?
package com.java1_2; public class LianXi22 { public static void main(String[] args) { int sum = 0;//計算每次分之前桃子數的總和 for(int i=2;i<50;i++) { if(i%5==1) {//假設i的值為最後第五次分完後的桃子數,同樣要滿足分為五份後餘1個 sum = i;//先把第五次分完後的桃數給sum int k = i; for(int j=5;j>=1;j--) {//分了五次,j=5為第五次分 k = k*5+1;//每j-1次都是第J次*5+1個 sum += k;//加上J的前一次 } if(sum%5==1) { System.out.println("原來桃子數最少有"+sum+"個"); break; } } } } }
結果為: