題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數爲多少?
1.程序分析: 兔子的規律爲數列1,1,2,3,5,8,13,21....
public class Question2 {
public static void main(String[] args) {
int month = 36;
int[] arrays = new int[36];
arrays[0] = 1;
arrays[1] = 1;
arrays[2] = 2;
for(int i=3; i<36; i++){
arrays[i] = arrays[i-1] + arrays[i-2];
}
for(int i=0; i<36; i++){
System.out.println("第"+(i+1)+"個月有"+arrays[i]+"只兔子");
}
}
}
【程序2】 題目:判斷101-200之間有多少個素數,並輸出所有素數。
1.程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,
則表明此數不是素數,反之是素數。
public class FiftyQuestion1 {
public static void main(String[] args){
int count = 0;
//找出1到200的質數並輸出
for(int i=2; i<=200; i++){
boolean isPrime = true;
for(int j=1; j<=Math.sqrt(i); j++){
if(i%j==0 && i!=j && j!=1){
isPrime=false;
break;
}
}
if(isPrime){
++count;
System.out.println("第"+count+"個質數:"+i);
}
}
}
}
【程序3】 題目:打印出所有的"水仙花數",所謂"水仙花數"是指一個三位數,其各位數字立方和等於該數本身。例如:153是一個"水仙花數",因爲153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循環控制100-999個數,每個數分解出個位,十位,百位。
public class Question3 {
public static void main(String[] args){
int[] digits = new int[3]; //位數:百、十、個
int[] pows3 = new int[3];
for(int i=100; i<=999; i++){
digits[0] = i/100; //百位
digits[1] = i/10 - 10*digits[0]; //十位
digits[2] = i%10;
pows3[0] = (int)Math.pow(digits[0],3);
pows3[1] = (int)Math.pow(digits[1],3);
pows3[2] = (int)Math.pow(digits[2],3);
if(pows3[0]+pows3[1]+pows3[2] == i){
System.out.println("數字"+i+"是水仙花數");
}
}
}
}
【程序4】 題目:將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。
程序分析:對n進行分解質因數,應先找到一個最小的質數k,然後按下述步驟完成:
(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,打印出即可。
(2)如果n<>k,但n能被k整除,則應打印出k的值,並用n除以k的商,作爲新的正整數你n,重複執行第一步。
(3)如果n不能被k整除,則用k+1作爲k的值,重複執行第一步。
public class Question4 {
//尋找小於limit的質數列表
public List<Integer> defactor(int limit){
List<Integer> list = new ArrayList<Integer>();
for(int i=2; i<=1000; i++){
if(isPrime(i)&&i<=limit/2){
list.add(i);
}
}
return list;
}
//判斷是否爲質數
public boolean isPrime(int num){
boolean flag = true;
for(int i=2; i<=num; i++){
flag = true;
for(int j=1; j<=Math.sqrt(i); j++){
if(i%j==0 && i!=j && j!=1){
flag=false;
break;
}
}
}
return flag;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
Question4 ques = new Question4();
List<Integer> factors;
List<Integer> facList = new ArrayList<Integer>();
System.out.println("輸入1000以內的整數:");
int num = in.nextInt();
int numTmp = num;
factors = ques.defactor(num); //找出輸入數字的質數列表
//核心邏輯
while(numTmp!=1){
for(int i=0;i<factors.size();i++){
if(numTmp % factors.get(i)==0){
facList.add(factors.get(i));
numTmp = numTmp / factors.get(i);
break;
}
}
}
//輸出結果
System.out.print(num + "=");
for(int i=0; i<facList.size()-1;i++){
System.out.print(facList.get(i)+"*");
}
System.out.print(facList.get(facList.size()-1));
}
}
【程序5】 題目:利用條件運算符的嵌套來完成此題:學習成績>=90分的同學用A表示,60-89分之間的用B表示,60分以下的用C表示。
1.程序分析:(a>b)?a:b這是條件運算符的基本例子。
public class Question5 {
public static void main(String[] args){
System.out.println("請輸入成績:");
Scanner in = new Scanner(System.in);
int score = in.nextInt();
System.out.print(score < 90 ? (score < 60 ? 'C' : 'B') : 'A');
}
}
【程序6】 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
1.程序分析:利用輾除法。
【程序7】
題目:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。
1.程序分析:利用while語句,條件爲輸入的字符不爲'\n'.
public class Question7 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("請輸入一句話,可以由數字、字母、空格、符號組成:");
String s = in.nextLine();
int let = 0;
int num = 0;
int space = 0;
int sym = 0;
for(int i=0; i<s.length(); i++) {
int c = s.charAt(i);
if (c>=48&&c<=57) {
++num;
} else if (c >= 65 && c <= 90 || c >= 97 && c <= 122) {
++let;
} else if (c == 32) {
++space;
} else {
++sym;
}
}
System.out.println("共輸入字母" + let + "個," + "數字" + num + "個," + "空格" + space + "個," + "其他符號" + sym + "個。");
}
}
【程序8】 題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。
1.程序分析:關鍵是計算出每一項的值。
public class Question8 {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("請輸入基數:");
int base = in.nextInt();
System.out.println("請輸入位數:");
int digits = in.nextInt();
int sum = 0;
int ai = 0;
for(int i=0; i<digits; i++){
ai = 0;
for(int j=0; j<=i; j++){
ai += base*(int)Math.pow(10,j);
}
sum += ai;
System.out.print(ai+" ");
}
System.out.println("求和爲:"+sum);
}
}
【程序9】 題目:一個數如果恰好等於它的因子之和,這個數就稱爲"完數"。例如6=1+2+3.編程 找出1000以內的所有完數。
【程序10】
題目:一球從100米高度自由落下,每次落地後反跳回原高度的一半;再落下,求它在 第10次落地時,共經過多少米?第10次反彈多高?
public class Question10 {
public static void main(String[] args){
double distance = 100;
double height = 100;
for(int i=1; i<10; i++){
distance += height;
height /= 2;
if(i == 9){
System.out.println("第"+(i+1)+"次反彈:"+ height);
}
}
System.out.println("總共經過"+distance+"米");
}
}
【程序11】 題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?
1.程序分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去 掉不滿足條件的排列。
【程序12】
題目:企業發放的獎金根據利潤提成。利潤(I)低於或等於10萬元時,獎金可提10%;利潤高於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可可提成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬之間時高於40萬元的部分,可提成3%;60萬到100萬之間時,高於60萬元的部分,可提成1.5%,高於100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤I,求應發放獎金總數?
1.程序分析:請利用數軸來分界,定位。注意定義時需把獎金定義成長整型。
【程序13】
題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
1.程序分析:在10萬以內判斷,先將該數加上100後再開方,再將該數加上268後再開方,如果開方後的結果滿足如下條件,即是結果。請看具體分析:
public class Question13 {
public static void main(String[] args){
int limit = 1000000;
for(int i=0;i<limit;i++){
int num1 = i+100;
int num2 = num1+168;
double dnum1 = Math.sqrt(num1);
double dnum2 = Math.sqrt(num2);
if(num1-(int)dnum1*(int)dnum1==0 && num2-(int)dnum2*(int)dnum2 ==0){
System.out.println(i+"是");
}
}
}
}
【程序14】 題目:輸入某年某月某日,判斷這一天是這一年的第幾天?
1.程序分析:以3月5日爲例,應該先把前兩個月的加起來,然後再加上5天即本年的第幾天,特殊情況,閏年且輸入月份大於3時需考慮多加一天。
public class Question14 {
static int[] month_days = {31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("請輸入日期,格式舉例:2016-08-26");
String date = in.nextLine();
String[] dates = date.split("-");
int year = Integer.parseInt(dates[0]);
int month = Integer.parseInt(dates[1]);
int day = Integer.parseInt(dates[2]);
int days = 0; //一年的第幾天
//輸入日期格式判斷
if(year<1900||year>2050){
System.out.println("輸入格式錯誤,年限不得超過1900-2050之間");
return;
}
else if(month<0||month>12){
System.out.println("輸入格式錯誤,月份不得超過1-12之間");
return;
}
else if(day<0){
System.out.println("輸入格式錯誤,天數不得爲負");
return;
}
else if(day>Question14.month_days[month]){
System.out.println("輸入格式錯誤,天數超過月份最大天數");
return;
}
//不是閏年
for(int i=0, t=month-1; i<t; i++){
days += Question14.month_days[i];
}
days += day;
//閏年則加一
if((year%400==0 || (year%100!=0 && year%4==0))){
if(month>2){
++days;
}
}
System.out.println(date+"是一年的第"+days+"天");
}
}
【程序15】 題目:輸入三個整數x,y,z,請把這三個數由小到大輸出。
1.程序分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小。
public class Question15 {
//比較三個數字大小
public static int[] compare3Nums(int[] array){
int tmp;
if(array[0]>array[1]){
tmp = array[0];
array[0] = array[1];
array[1] = tmp;
}
if(array[0]>array[2]){
tmp = array[0];
array[0] = array[2];
array[2] = tmp;
}
if(array[1]>array[2]){
tmp = array[1];
array[1] = array[2];
array[2] = tmp;
}
return array;
}
//輸出數組內容
public static void printArray(int[] array){
for(int i=0; i<array.length; i++){
System.out.print(array[i]+" ");
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("請輸入三個數字:");
int[] nums = new int[3];
for(int i=0; i<nums.length; i++){
nums[i] = in.nextInt();
}
int[] comNums = Question15.compare3Nums(nums);
System.out.println("從小到大排序:");
printArray(comNums);
}
}
【程序16】 題目:輸出9*9口訣。
1.程序分析:分行與列考慮,共9行9列,i控制行,j控制列。
public class Question16 {
public static void main(String[] args){
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
System.out.print(i+"*"+j+"="+i*j+" ");
if (j==9){
System.out.println();
}
}
}
}
}
【程序17】 題目:猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個 第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下 的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。
1.程序分析:採取逆向思維的方法,從後往前推斷。
public class Question17 {
public static void main(String[] args){
int day = 10; //10天
int rest = 1; //剩下一個
System.out.println("第1天總共有"+rest+"個桃子");
for(int i=1; i<day; i++){
rest =rest*2+1;
System.out.println("第"+(day-i)+"天總共有"+rest+"個桃子");
}
System.out.println("第一天共摘了"+rest+"個桃子");
}
}
【程序18】 題目:兩個乒乓球隊進行比賽,各出三人。甲隊爲a,b,c三人,乙隊爲x,y,z三人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊賽手的名單。
1.程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除, 則表明此數不是素數,反之是素數。
題目:打印出如下圖案(菱形)
*
***
******
********
******
***
*
1.程序分析:先把圖形分成兩部分來看待,前四行一個規律,後三行一個規律,利用雙重 for循環,第一層控制行,第二層控制列。
【程序20】
題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。
1.程序分析:請抓住分子與分母的變化規律,先計算出數列的前n項。
public class Question20 {
public static void main(String[] args){
int[] array = new int[21];
//分子和分母規律相同,先計算出規律數列array的前21項
for(int i=0; i<21; i++){
if(i==0){
array[0]=1;
}
else if(i==1){
array[1]=2;
}
else{
array[i] = array[i-1]+array[i-2];
}
}
double sum = 0;
for(int i=0; i<20; i++){
double ai = (double)array[i+1]/(double)array[i];
sum += ai;
System.out.print(ai+" ");
}
System.out.println("\n前20項和是:"+sum);
}
}
【程序21】 題目:求1+2!+3!+...+20!的和
1.程序分析:用二重for循環,求階乘的和,先求出每一項階乘再累加。注意需要用long,不能用int。
public class Question21 {
public static void main(String[] args){
long sum = 0L;
for(int i=1; i<=20; i++){
long num = 1L;
for(int j=1; j<=i; j++){
num *= j;
}
System.out.println("第"+i+"項爲:"+num);
sum += num;
}
System.out.println("\n和爲:"+sum);
}
}
【程序22】 題目:利用遞歸方法求5!。
1.程序分析:自身調用自身的函數,是遞歸函數。遞歸函數都有一個簡單的出口。
public class Question22 {
public static long multi(int num){
if(num == 1){//遞歸出口
return 1;
}
else{
return num*multi(num-1);
}
}
public static void main(String[] args){
System.out.println("請輸入計算階乘的基數:");
Scanner in = new Scanner(System.in);
int radix = in.nextInt();
long num = multi(radix);
System.out.println(radix+"的階乘是:"+num);
}
}
【程序23】 題目:有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最後問第一個人,他說是10歲。請問第五個人多大?
1.程序分析:利用遞歸的方法,遞歸分爲回推和遞推兩個階段。要想知道第五個人歲數,需知道第四人的歲數,依次類推,推到第一人(10歲),再往回推。
public class Question23 {
public static int calAge(int num){
if(num==1){
return 10;
}
else{
return calAge(num-1)+2;
}
}
public static void main(String[] args){
System.out.println("第五個人的年齡是:"+calAge(5));
}
}
【程序24】 題目:給一個不多於5位的正整數,要求:一、求它是幾位數,二、逆序打印出各位數字。
程序分析:輸入的數字不斷除以10,整型做除法只會保留整數部分,所以判定條件爲!=0.
public class Question24 {
//計算數字的位數
public static int calDigits(int num){
int digits = 0;
while (num!=0){
num /= 10;
++digits;
}
return digits;
}
public static void reverse(int num){
int tmp = 0;
while (num!=0){
tmp = num - (num/10)*10;
num /= 10;
System.out.print(tmp);
}
}
public static void main(String[] args){
System.out.println("請輸入一個數字(小於五位):");
Scanner in = new Scanner(System.in);
int num = in.nextInt();
int digit = 0;
if(num<=0){
System.out.println("請輸入正整數");
}
else if((digit=calDigits(num))>5){
System.out.println("請輸入小於五位的數字");
}
else{
System.out.println("輸入數字:"+num+",位數:"+digit);
}
System.out.print("逆序輸出"+num+"結果是:");
reverse(num);
}
}
【程序25】 題目:一個5位數,判斷它是不是迴文數。即12321是迴文數,個位與萬位相同,十位與千位相同。
【程序26】
題目:請輸入星期幾的第一個字母來判斷一下是星期幾,如果第一個字母一樣,則繼續 判斷第二個字母。
1.程序分析:用switch-case語句比較好,如果第一個字母一樣,則判斷用情況語句或if語句判斷第二個字母。
public class Question26 {
static String[] weekdays = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
public static void main(String[] args){
System.out.println("請輸入星期幾(英文):");
for(int i=0; i<weekdays.length; i++){
System.out.print(weekdays[i]+" ");
}
System.out.println();
Scanner in = new Scanner(System.in);
String week = in.nextLine();
switch (week.charAt(0)){
case 'M':{
System.out.println("Monday,星期一");
break;
}
case 'W':{
System.out.println("Wednesday,星期三");
break;
}
case 'F':{
System.out.println("Friday,星期五");
break;
}
case 'T':{
if(week.charAt(1)=='u'||week.charAt(1)=='U'){
System.out.println("Tuesday,星期二");
}
else {
System.out.println("Thursday,星期四");
}
break;
}
case 'S':{
if(week.charAt(1)=='a'||week.charAt(1)=='A'){
System.out.println("Saturday,星期六");
}
else {
System.out.println("Sunday,星期日");
}
break;
}
}
}
}
【程序27】 題目:求100之內的素數
程序解析:代碼複用的重要性。
public class Question27 { public static void findPrime(int limit) { if (limit <= 0) { return; } int count = 0; //找出1到limit的質數並輸出 for (int i = 2; i <= limit; i++) { boolean isPrime = true; for (int j = 1; j <= Math.sqrt(i); j++) { if (i % j == 0 && i != j && j != 1) { isPrime = false; break; } } if (isPrime) { ++count; System.out.println("第" + count + "個質數:" + i); } } } public static void main(String[] args) { findPrime(100); } }【程序28】
題目:對10個數進行排序
1.程序分析:可以利用選擇法,即從後9個比較過程中,選擇一個最小的與第一個元素交換, 下次類推,即用第二個元素與後8個進行比較,並進行交換。
【程序29】
題目:求一個3*3矩陣對角線元素之和
1.程序分析:利用雙重for循環控制輸入二維數組,再將a[i][i]累加後輸出。
【程序30】
題目:有一個已經排好序的數組。現輸入一個數,要求按原來的規律將它插入數組中。
1. 程序分析:首先判斷此數是否大於最後一個數,然後再考慮插入中間的數的情況,插入後此元素之後的數,依次後移一個位置。
【程序31】
題目:將一個數組逆序輸出。
1.程序分析:用第一個與最後一個交換。
【程序32】
題目:取一個整數a從右端開始的4~7位。
程序分析:可以這樣考慮:
(1)先使a右移4位。
(2)設置一個低4位全爲1,其餘全爲0的數。可用~(~0<<4)
(3)將上面二者進行&運算。
【程序33】
題目:打印出楊輝三角形(要求打印出10行如下圖)
1.程序分析:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
【程序34】
題目:輸入3個數a,b,c,按大小順序輸出。
1.程序分析:利用指針方法。
【程序35】
題目:輸入數組,最大的與第一個元素交換,最小的與最後一個元素交換,輸出數組。
【程序36】
題目:有n個整數,使其前面各數順序向後移m個位置,最後m個數變成最前面的m個數
【程序37】
題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。
【程序38】
題目:寫一個函數,求一個字符串的長度,在main函數中輸入字符串,並輸出其長度。
【程序39】
題目:編寫一個函數,輸入n爲偶數時,調用函數求1/2+1/4+...+1/n,當輸入n爲奇數時,調用函數1/1+1/3+...+1/n(利用指針函數)
【程序40】
題目:字符串排序。
【程序41】
題目:海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子憑據分爲五份,多了一個,這隻猴子把多的一個扔入海中,拿走了一份。第二隻猴子把剩下的桃子又平均分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,第三、第四、第五隻猴子都是這樣做的,問海灘上原來最少有多少個桃子?
【程序42】
題目:809*??=800*??+9*??+1 其中??代表的兩位數,8*??的結果爲兩位數,9*??的結果爲3位數。求??代表的兩位數,及809*??後的結果。
【程序43】
題目:求0—7所能組成的奇數個數。
【程序44】
題目:一個偶數總能表示爲兩個素數之和。
【程序45】
題目:判斷一個素數能被幾個9整除
【程序46】
題目:兩個字符串連接程序
【程序47】
題目:讀取7個數(1—50)的整數值,每讀取一個值,程序打印出該值個數的*。
【程序48】
題目:某個公司採用公用電話傳遞數據,數據是四位的整數,在傳遞過程中是加密的,加密規則如下:每位數字都加上5,然後用和除以10的餘數代替該數字,再將第一位和第四位交換,第二位和第三位交換。
【程序49】
題目:計算字符串中子串出現的次數
【程序50】
題目:有五個學生,每個學生有3門課的成績,從鍵盤輸入以上數據(包括學生號,姓名,三門課成績),計算出平均成績,況原有的數據和計算出的平均分數存放在磁盤文件"stud"中。