50道基礎(chǔ)編程題練習(xí)你的邏輯思維(一)
【程序1】
題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔子,假如兔子都不死,問每個(gè)月的兔子對(duì)數(shù)為多少?
程序分析: 兔子的規(guī)律為數(shù)列1,1,2,3,5,8,13,21....
public class Prog1{
public static void main(String[] args){
????int n = 10;
????System.out.println("第"+n+"個(gè)月兔子總數(shù)為"+fun(n));
}
private static int fun(int n){
????if(n==1 || n==2)
???????return 1;
????else
???????return fun(n-1)+fun(n-2);
????}
}
【程序2】
題目:判斷101-200之間有多少個(gè)素?cái)?shù),并輸出所有素?cái)?shù)。
程序分析:判斷素?cái)?shù)的方法:用一個(gè)數(shù)分別去除2到sqrt(這個(gè)數(shù)),如果能被整除,則表明此數(shù)不是素?cái)?shù),反之是素?cái)?shù)。
public class Prog2{
????public static void main(String[] args){
????int m = 1;
????int n = 1000;
????int count = 0;
????//統(tǒng)計(jì)素?cái)?shù)個(gè)數(shù)
????for(int i=m;i<n;i++){
????????if(isPrime(i)){
????????????count++;
????????????System.out.print(i+" ");
????????????if(count%10==0){
????????????System.out.println();
????????}
????}
}
System.out.println();
System.out.println("在"+m+"和"+n+"之間共有"+count+"個(gè)素?cái)?shù)");
}
//判斷素?cái)?shù)
private static boolean isPrime(int n){
????boolean flag = true;
????if(n==1)
??????flag = false;
????else{
????????for(int i=2;i<=Math.sqrt(n);i++){
????????if((n%i)==0 || n==1){
????????flag = false;
????????break;
????}
?????else
???????flag = true;
??????}
????}
????return flag;
????}
}
【程序3】
題目:打印出所有的"水仙花數(shù)",所謂"水仙花數(shù)"是指一個(gè)三位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如:153是一個(gè)"水仙花數(shù)",因?yàn)?53=1的三次方+5的三次方+3的三次方。
程序分析:利用for循環(huán)控制100-999個(gè)數(shù),每個(gè)數(shù)分解出個(gè)位,十位,百位。
public class Prog3{
public static void main(String[] args){
????for(int i=100;i<1000;i++){
????if(isLotus(i))
???????System.out.print(i+" ");
????}
????System.out.println();
}
//判斷水仙花數(shù)
private static boolean isLotus(int lotus){
????int m = 0;
????int n = lotus;
????int sum = 0;
????m = n/100;
????n ?-= m*100;
????sum = m*m*m;
????m = n/10;
????n -= m*10;
????sum += m*m*m + n*n*n;
????if(sum==lotus)
????????return true;
????else
????????return false;
????}
}
【程序4】
題目:將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=2*3*3*5。
程序分析:對(duì)n進(jìn)行分解質(zhì)因數(shù),應(yīng)先找到一個(gè)最小的質(zhì)數(shù)k,然后按下述步驟完成:
(1)如果這個(gè)質(zhì)數(shù)恰等于n,則說明分解質(zhì)因數(shù)的過程已經(jīng)結(jié)束,打印出即可。
(2)如果n<>k,但n能被k整除,則應(yīng)打印出k的值,并用n除以k的商,作為新的正整數(shù)n,重復(fù)執(zhí)行第一步。
(3)如果n不能被k整除,則用k+1作為k的值,重復(fù)執(zhí)行第一步。
public class Prog4{
????public static void main(String[] args){
????????int n = 13;
????????decompose(n);
????}
????private static void decompose(int n){
????????System.out.print(n+"=");
????????????for(int i=2;i<n+1;i++){
????????????????while(n%i==0 && n!=i){
????????????????n/=i;
????????????????System.out.print(i+"*");
????????????}
????????????if(n==i){
????????????????System.out.println(i);
????????????????break;
????????????}
????????}
????}
}
【程序5】
題目:利用條件運(yùn)算符的嵌套來完成此題:學(xué)習(xí)成績(jī)>=90分的同學(xué)用A表示,60-89分之間的用B表示,60分以下的用C表示。
程序分析:(a>b)?a:b這是條件運(yùn)算符的基本例子。
public class Prog5{
????public static void main(String[] args){
????int n = -1;
????try{
????????????n = Integer.parseInt(args[0]);
??????}catch(ArrayIndexOutOfBoundsException e){
????????????System.out.println("請(qǐng)輸入成績(jī)");
????????return;
????}
????grade(n);
}
//成績(jī)等級(jí)計(jì)算
private static void grade(int n){
????if(n>100 || n<0)
??????System.out.println("輸入無效");
????else{
??????String str = (n>=90)?"分,屬于A等":((n>60)?"分,屬于B等":"分,屬于C等");
??????System.out.println(n+str);
????}
????}
}
【程序6】
題目:輸入兩個(gè)正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù)。
程序分析:利用輾除法。
public class Prog6{
????public static void main(String[] args){
????int m,n;
????try{
????????m = Integer.parseInt(args[0]);
????????n = Integer.parseInt(args[1]);
????}catch(ArrayIndexOutOfBoundsException e){
????????System.out.println("輸入有誤");
????????return;
????}
????max_min(m,n);
}
//求最大公約數(shù)和最小公倍數(shù)
private static void max_min(int m, int n){
????int temp = 1;
????int yshu = 1;
????int bshu = m*n;
????if(n<m){
????????temp = n;
????????n = m;
????????m = temp;
????}
????while(m!=0){
????????temp = n%m;
????????n = m;
????????m = temp;
????}
????yshu = n;
????bshu /= n;
????System.out.println(m+"和"+n+"的最大公約數(shù)為"+yshu);
????System.out.println(m+"和"+n+"的最小公倍數(shù)為"+bshu);
????}
}
【程序7】
題目:輸入一行字符,分別統(tǒng)計(jì)出其中英文字母、空格、數(shù)字和其它字符的個(gè)數(shù)。
程序分析:利用while語句,條件為輸入的字符不為'\n'.
import java.util.Scanner;
public class Prog7_1{
????public static void main(String[] args){
????System.out.print("請(qǐng)輸入一串字符:");
????Scanner scan = new Scanner(System.in);
????String str = scan.nextLine();//將一行字符轉(zhuǎn)化為字符串
????scan.close();
????count(str);
}
//統(tǒng)計(jì)輸入的字符數(shù)
private static void count(String str){
????String E1 = "[\u4e00-\u9fa5]";//漢字
????String E2 = "[a-zA-Z]";
????String E3 = "[0-9]";
????String E4 = "\\s";//空格
????int countChinese = 0;
????int countLetter = 0;
????int countNumber = 0;
????int countSpace = 0;
????int countOther = 0;
????char[] array_Char = str.toCharArray();//將字符串轉(zhuǎn)化為字符數(shù)組
????String[] array_String = new String[array_Char.length];//漢字只能作為字符串處理
????for(int i=0;i<array_Char.length;i++)
??????array_String[i] = String.valueOf(array_Char[i]);
????//遍歷字符串?dāng)?shù)組中的元素
????for(String s:array_String){
????if(s.matches(E1))
??????countChinese++;
????else if(s.matches(E2))
??????countLetter++;
????else if(s.matches(E3))
??????countNumber++;
????else if(s.matches(E4))
??????countSpace++;
????else
??????countOther++;
????}
????System.out.println("輸入的漢字個(gè)數(shù):"+countChinese);
????System.out.println("輸入的字母?jìng)€(gè)數(shù):"+countLetter);
????System.out.println("輸入的數(shù)字個(gè)數(shù):"+countNumber);
????System.out.println("輸入的空格個(gè)數(shù):"+countSpace);
????System.out.println("輸入的其它字符個(gè)數(shù):"+countSpace);
????}
}
import java.util.*;
public class Prog7_2{
public static void main(String[] args){
??System.out.println("請(qǐng)輸入一行字符:");
??Scanner scan = new Scanner(System.in);
??String str = scan.nextLine();
??scan.close();
??count(str);
}
//統(tǒng)計(jì)輸入的字符
private static void count(String str){
????List<String> list = new ArrayList<String>();
????char[] array_Char = str.toCharArray();
????for(char c:array_Char)
??????list.add(String.valueOf(c));//將字符作為字符串添加到list表中
????Collections.sort(list);//排序
????for(String s:list){
????????int begin = list.indexOf(s);
????????int end = list.lastIndexOf(s);
????????//索引結(jié)束統(tǒng)計(jì)字符數(shù)
????????if(list.get(end)==s)
??????????System.out.println("字符‘"+s+"’有"+(end-begin+1)+"個(gè)");
????????}
????}
}
【程序8】
題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個(gè)數(shù)字。例如2+22+222+2222+22222(此時(shí)共有5個(gè)數(shù)相加),幾個(gè)數(shù)相加有鍵盤控制。
程序分析:關(guān)鍵是計(jì)算出每一項(xiàng)的值。
import java.util.Scanner;
?
public class Prog8{
????public static void main(String[] args){
????System.out.print("求s=a+aa+aaa+aaaa+...的值,請(qǐng)輸入a的值:");
????Scanner scan = new Scanner(System.in).useDelimiter("\\s*");//以空格作為分隔符
????int a = scan.nextInt();
????int n = scan.nextInt();
????scan.close();//關(guān)閉掃描器
????System.out.println(expressed(2,5)+add(2,5));
}
//求和表達(dá)式
private static String expressed(int a,int n){
????StringBuffer sb = new StringBuffer();
????StringBuffer subSB = new StringBuffer();
????for(int i=1;i<n+1;i++){
??????subSB = subSB.append(a);
??????sb = sb.append(subSB);
??????if(i<n)
????????sb = sb.append("+");
????}
????sb.append("=");
????return sb.toString();
}
//求和
private static long add(int a,int n){
????long sum = 0;
????long subSUM = 0;
????for(int i=1;i<n+1;i++){
????????subSUM = subSUM*10+a;
????????sum = sum+subSUM;
????}
????return sum;
????}
}
【程序9】
題目:一個(gè)數(shù)如果恰好等于它的因子之和,這個(gè)數(shù)就稱為"完數(shù)"。例如6=1+2+3.編程找出1000以內(nèi)的所有完數(shù)。
public class Prog9{
public static void main(String[] args){
????int n = 10000;
????compNumber(n);
}
//求完數(shù)
private static void compNumber(int n){
????int count = 0;
????System.out.println(n+"以內(nèi)的完數(shù):");
????for(int i=1;i<n+1;i++){
????????int sum = 0;
????????for(int j=1;j<i/2+1;j++){
????????????if((i%j)==0){
????????????sum += j;
????????????if(sum==i){
??????????????????System.out.print(i+" ");
??????????????????if((count++)%5==0)
????????????????????System.out.println();
????????????????????}
????????????????}
????????????}
????????}
????}
}
【程序10】
題目:一球從100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地時(shí),共經(jīng)過多少米?第10次反彈多高?
import java.util.Scanner;
public class Prog10{
????public static void main(String[] args){
????System.out.print("請(qǐng)輸入小球落地時(shí)的高度和求解的次數(shù):");
????Scanner scan = new Scanner(System.in).useDelimiter("\\s");
????int h = scan.nextInt();
????int n = scan.nextInt();
????scan.close();
????distance(h,n);
}
//小球從h高度落下,經(jīng)n次反彈后經(jīng)過的距離和反彈的高度
private static void distance(int h,int n){
????double length = 0;
????for(int i=0;i<n;i++){
????length += h;
????h /=2.0 ;
????}
????System.out.println("經(jīng)過第"+n+"次反彈后,小球共經(jīng)過"+length+"米,"+"第"+n+"次反彈高度為"+h+"米");
????}
}
?? 看完兩件事
如果你覺得這篇內(nèi)容對(duì)你挺有啟發(fā),我想邀請(qǐng)你幫我兩個(gè)小忙:
點(diǎn)個(gè)「贊」或者「轉(zhuǎn)發(fā)評(píng)論」,讓更多的人也能看到這篇內(nèi)容(喜歡不點(diǎn)贊,都是耍流氓 -_-)
關(guān)注公眾號(hào)「前端知識(shí)分享喵」,不定時(shí)更新前端技術(shù)分享,
公眾號(hào)后臺(tái)回復(fù)「電子書」即可免費(fèi)獲取精選的前端電子書。
添加 MagnumHou 微信,可以獲取 up 主有的大機(jī)構(gòu)的學(xué)習(xí)視頻哦