ply

          吞噬黑暗
          posts - 1, comments - 11, trackbacks - 0, articles - 13
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          JAVA經典算法40題

          Posted on 2011-08-21 23:11 ply 閱讀(951) 評論(0)  編輯  收藏 所屬分類: 知識小串通
          1: JAVA經典算法40題
            2: 【程序1】   題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第四個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?  
            3: 1.程序分析:   兔子的規律為數列1,1,2,3,5,8,13,21....  
            4: public class exp2{
            5:  public static void main(String args[]){
            6:   int i=0;
            7:   for(i=1;i<=20;i++)
            8:    System.out.println(f(i));
            9:  }
           10:  public static int f(int x)
           11:  {
           12:   if(x==1 || x==2)
           13:    return 1;
           14:   else
           15:    return f(x-1)+f(x-2);
           16:  }
           17: }
           18: 或
           19: public class exp2{
           20:  public static void main(String args[]){
           21:   int i=0;
           22:   math mymath = new math();
           23:   for(i=1;i<=20;i++)
           24:    System.out.println(mymath.f(i));
           25:  }
           26:
           27: }
           28: class math
           29: {
           30:  public int f(int x)
           31:  {
           32:   if(x==1 || x==2)
           33:    return 1;
           34:   else
           35:    return f(x-1)+f(x-2);
           36:  }
           37: }
           38:
           39: 【程序2】   題目:判斷101-200之間有多少個素數,并輸出所有素數。  
           40: 1.程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,  
           41: 則表明此數不是素數,反之是素數。  
           42: public class exp2{
           43:  public static void main(String args[]){
           44:   int i=0;
           45:   math mymath = new math();
           46:   for(i=2;i<=200;i++)
           47:    if(mymath.iszhishu(i)==true)
           48:    System.out.println(i);
           49:  }
           50: }
           51: class math
           52: {
           53:  public int f(int x)
           54:  {
           55:   if(x==1 || x==2)
           56:    return 1;
           57:   else
           58:    return f(x-1)+f(x-2);
           59:  }
           60:  public boolean iszhishu(int x)
           61:  {
           62:   for(int i=2;i<=x/2;i++)
           63:    if (x % 2==0 )
           64:     return false;
           65:   return true;
           66:  }
           67: }
           68:
           69: 【程序3】   題目:打印出所有的 "水仙花數 ",所謂 "水仙花數 "是指一個三位數,其各位數字立方和等于該數本身。例如:153是一個 "水仙花數 ",因為153=1的三次方+5的三次方+3的三次方。  
           70: 1.程序分析:利用for循環控制100-999個數,每個數分解出個位,十位,百位。  
           71: public class exp2{
           72:  public static void main(String args[]){
           73:   int i=0;
           74:   math mymath = new math();
           75:   for(i=100;i<=999;i++)
           76:    if(mymath.shuixianhua(i)==true)
           77:    System.out.println(i);
           78:  }
           79: }
           80: class math
           81: {
           82:  public int f(int x)
           83:  {
           84:   if(x==1 || x==2)
           85:    return 1;
           86:   else
           87:    return f(x-1)+f(x-2);
           88:  }
           89:  public boolean iszhishu(int x)
           90:  {
           91:   for(int i=2;i<=x/2;i++)
           92:    if (x % 2==0 )
           93:     return false;
           94:   return true;
           95:  }
           96:  public boolean shuixianhua(int x)
           97:  {
           98:     int i=0,j=0,k=0;
           99:     i=x / 100;
          100:     j=(x % 100) /10;
          101:     k=x % 10;
          102:     if(x==i*i*i+j*j*j+k*k*k)
          103:      return true;
          104:     else
          105:      return false;
          106:    
          107:  }
          108: }
          109: 【程序4】   題目:將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。  
          110: 程序分析:對n進行分解質因數,應先找到一個最小的質數k,然后按下述步驟完成:  
          111: (1)如果這個質數恰等于n,則說明分解質因數的過程已經結束,打印出即可。  
          112: (2)如果n <> k,但n能被k整除,則應打印出k的值,并用n除以k的商,作為新的正整數你,重復執行第一步。  
          113: (3)如果n不能被k整除,則用k+1作為k的值,重復執行第一步。  
          114: public class exp2{
          115:  public exp2(){}
          116:     public void fengjie(int n){
          117:         for(int i=2;i<=n/2;i++){
          118:             if(n%i==0){
          119:                 System.out.print(i+"*");
          120:                 fengjie(n/i);
          121:                 }
          122:         }
          123:         System.out.print(n);
          124:         System.exit(0);///不能少這句,否則結果會出錯
          125:         }
          126:         public static void main(String[] args){
          127:              String str="";
          128:              exp2 c=new exp2();
          129:              str=javax.swing.JOptionPane.showInputDialog("請輸入N的值(輸入exit退出):");
          130:              int N;
          131:              N=0;
          132:              try{
          133:                      N=Integer.parseInt(str);
          134:                      }catch(NumberFormatException e){
          135:                          e.printStackTrace();
          136:                          }
          137:             System.out.print(N+"分解質因數:"+N+"=");
          138:             c.fengjie(N);
          139:         }   
          140: }
          141: 【程序5】   題目:利用條件運算符的嵌套來完成此題:學習成績> =90分的同學用A表示,60-89分之間的用B表示,60分以下的用C表示。  
          142: 1.程序分析:(a> b)?a:b這是條件運算符的基本例子。  
          143: import javax.swing.*;
          144: public class ex5 {
          145:         public static void main(String[] args){
          146:              String str="";
          147:              str=JOptionPane.showInputDialog("請輸入N的值(輸入exit退出):");
          148:              int N;
          149:              N=0;
          150:              try{
          151:                 N=Integer.parseInt(str);
          152:               }
          153:              catch(NumberFormatException e){
          154:                 e.printStackTrace();
          155:                }
          156:              str=(N>90?"A":(N>60?"B":"C"));
          157:              System.out.println(str);
          158:         }   
          159: }
          160: 【程序6】   題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。  
          161: 1.程序分析:利用輾除法。  
          162: 最大公約數:
          163: public class CommonDivisor{
          164:     public static void main(String args[])
          165:     {
          166:         commonDivisor(24,32);
          167:     }
          168:     static int commonDivisor(int M, int N)
          169:     {
          170:         if(N<0||M<0)
          171:         {
          172:             System.out.println("ERROR!");
          173:             return -1;
          174:         }
          175:         if(N==0)
          176:         {
          177:             System.out.println("the biggest common divisor is :"+M);
          178:             return M;
          179:         }
          180:         return commonDivisor(N,M%N);
          181:     }
          182: }
          183: 最小公倍數和最大公約數:
          184: import java.util.Scanner;
          185: public class CandC
          186: {
          187: //下面的方法是求出最大公約數
          188: public static int **(int m, int n)
          189: {
          190: while (true)
          191: {
          192: if ((m = m % n) == 0)
          193: return n;
          194: if ((n = n % m) == 0)
          195: return m;
          196: }
          197: }
          198: public static void main(String args[]) throws Exception
          199: {
          200: //取得輸入值
          201: //Scanner chin = new Scanner(System.in);
          202: //int a = chin.nextInt(), b = chin.nextInt();
          203: int a=23; int b=32;
          204: int c = **(a, b);
          205: System.out.println("最小公倍數:" + a * b / c + "\n最大公約數:" + c);
          206: }
          207: }
          208: 【程序7】   題目:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。  
          209: 1.程序分析:利用while語句,條件為輸入的字符不為 '\n '.  
          210: import java.util.Scanner;
          211: public class ex7 {
          212:   public static void main(String args[])
          213:   {
          214:    System.out.println("請輸入字符串:");
          215:    Scanner scan=new Scanner(System.in);
          216:    String str=scan.next();
          217:    String E1="[\u4e00-\u9fa5]";
          218:    String E2="[a-zA-Z]";
          219:    int countH=0;
          220:    int countE=0;
          221:    char[] arrChar=str.toCharArray();
          222:    String[] arrStr=new String[arrChar.length];
          223:    for (int i=0;i<arrChar.length ;i++ )
          224:    {
          225:     arrStr[i]=String.valueOf(arrChar[i]);
          226:    }
          227:    for (String i: arrStr )
          228:    {
          229:     if (i.matches(E1))
          230:     {
          231:      countH++;
          232:     }
          233:     if (i.matches(E2))
          234:     {
          235:      countE++;
          236:     }
          237:    }
          238:    System.out.println("漢字的個數"+countH);
          239:    System.out.println("字母的個數"+countE);
          240:   }
          241:  }
          242: 【程序8】   題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。  
          243: 1.程序分析:關鍵是計算出每一項的值。  
          244: import java.io.*;
          245: public class Sumloop {
          246:   public static void main(String[] args) throws IOException
          247:   {
          248:    int s=0;
          249:    String output="";
          250:    BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in));
          251:    System.out.println("請輸入a的值");
          252:    String input =stadin.readLine();
          253:    for(int i =1;i<=Integer.parseInt(input);i++)
          254:    {
          255:     output+=input;
          256:     int a=Integer.parseInt(output);
          257:     s+=a;
          258:    }
          259:    System.out.println(s);
          260:   }
          261: }
          262: 另解:
          263: import java.io.*;
          264: public class Sumloop {
          265:   public static void main(String[] args) throws IOException
          266:   {
          267:    int s=0;
          268:    int n;
          269:    int t=0;
          270:    BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in));
          271:    String input = stadin.readLine();
          272:    n=Integer.parseInt(input);
          273:    for(int i=1;i<=n;i++){
          274:     t=t*10+n;
          275:     s=s+t;
          276:     System.out.println(t);
          277:    }
          278:    System.out.println(s);
          279:   }
          280: }
          281: 【程序9】   題目:一個數如果恰好等于它的因子之和,這個數就稱為 "完數 "。例如6=1+2+3.編程   找出1000以內的所有完數。  
          282: public class Wanshu {
          283:  public static void main(String[] args)
          284:  {
          285:   int s;
          286:   for(int i=1;i<=1000;i++)
          287:   {
          288:    s=0;
          289:    for(int j=1;j<i;j++)
          290:     if(i % j==0)
          291:      s=s+j;
          292:    if(s==i)
          293:     System.out.print(i+" ");
          294:   }
          295:   System.out.println();
          296:  }
          297: }
          298: 【程序10】 題目:一球從100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在   第10次落地時,共經過多少米?第10次反彈多高?  
          299: public class Ex10 {
          300:  public static void main(String[] args)
          301:  {
          302:   double s=0;
          303:   double t=100;
          304:   for(int i=1;i<=10;i++)
          305:   {
          306:          s+=t;
          307:          t=t/2;
          308:   }
          309:   System.out.println(s);
          310:   System.out.println(t);
          311:  
          312:  }
          313: }
          314: 【程序11】   題目:有1、2、3、4個數字,能組成多少個互不相同且無重復數字的三位數?都是多少?  
          315: 1.程序分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列后再去   掉不滿足條件的排列。  
          316: public class Wanshu {
          317:  public static void main(String[] args)
          318:  {
          319:     int i=0;
          320:     int j=0;
          321:     int k=0;
          322:     int t=0;
          323:     for(i=1;i<=4;i++)
          324:      for(j=1;j<=4;j++)
          325:       for(k=1;k<=4;k++)
          326:        if(i!=j && j!=k && i!=k)
          327:        {t+=1;
          328:         System.out.println(i*100+j*10+k);
          329:  } 
          330:     System.out.println (t);
          331:     }
          332: }
          333: 【程序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,求應發放獎金總數?  
          334: 1.程序分析:請利用數軸來分界,定位。注意定義時需把獎金定義成長整型。  
          335: import java .util.*;
          336: public class test {
          337:  public static void main (String[]args){
          338:   double sum;//聲明要儲存的變量應發的獎金
          339:   Scanner input =new Scanner (System.in);//導入掃描器
          340:   System.out.print ("輸入當月利潤");
          341:   double lirun=input .nextDouble();//從控制臺錄入利潤
          342:   if(lirun<=100000){
          343:    sum=lirun*0.1;
          344:   }else if (lirun<=200000){
          345:    sum=10000+lirun*0.075;
          346:   }else if (lirun<=400000){
          347:    sum=17500+lirun*0.05;
          348:   }else if (lirun<=600000){
          349:    sum=lirun*0.03;
          350:   }else if (lirun<=1000000){
          351:    sum=lirun*0.015;
          352:   } else{
          353:    sum=lirun*0.01;
          354:   }
          355:   System.out.println("應發的獎金是"+sum);
          356:   }
          357: }
          358: 后面其他情況的代碼可以由讀者自行完善.
          359:
          360: 【程序13】  
          361: 題目:一個整數,它加上100后是一個完全平方數,加上168又是一個完全平方數,請問該數是多少?  
          362: 1.程序分析:在10萬以內判斷,先將該數加上100后再開方,再將該數加上268后再開方,如果開方后的結果滿足如下條件,即是結果。請看具體分析:  
          363: public class test {
          364:  public static void main (String[]args){
          365:     long k=0;
          366:     for(k=1;k<=100000l;k++)
          367:      if(Math.floor(Math.sqrt(k+100))==Math.sqrt(k+100) && Math.floor(Math.sqrt(k+168))==Math.sqrt(k+168))
          368:       System.out.println(k);
          369:  }
          370: }
          371: 【程序14】 題目:輸入某年某月某日,判斷這一天是這一年的第幾天?  
          372: 1.程序分析:以3月5日為例,應該先把前兩個月的加起來,然后再加上5天即本年的第幾天,特殊情況,閏年且輸入月份大于3時需考慮多加一天。  
          373: import java.util.*;
          374: public class test {
          375:  public static void main (String[]args){
          376:   int day=0;
          377:   int month=0;
          378:   int year=0;
          379:   int sum=0;
          380:   int leap;  
          381:   System.out.print("請輸入年,月,日\n");  
          382:   Scanner input = new Scanner(System.in);
          383:   year=input.nextInt();
          384:   month=input.nextInt();
          385:   day=input.nextInt();
          386:   switch(month) /*先計算某月以前月份的總天數*/ 
          387:   {  
          388:   case 1:
          389:    sum=0;break;  
          390:   case 2:
          391:    sum=31;break;  
          392:   case 3:
          393:    sum=59;break;  
          394:   case 4:
          395:    sum=90;break;  
          396:   case 5:
          397:    sum=120;break;  
          398:   case 6:
          399:    sum=151;break;  
          400:   case 7:
          401:    sum=181;break;  
          402:   case 8:
          403:    sum=212;break;  
          404:   case 9:
          405:    sum=243;break;  
          406:   case 10:
          407:    sum=273;break;  
          408:   case 11:
          409:    sum=304;break;  
          410:   case 12:
          411:    sum=334;break;  
          412:   default:
          413:    System.out.println("data error");break;
          414:   }  
          415:   sum=sum+day; /*再加上某天的天數*/ 
          416:   if(year%400==0||(year%4==0&&year%100!=0))/*判斷是不是閏年*/ 
          417:    leap=1;  
          418:   else 
          419:    leap=0;  
          420:   if(leap==1 && month>2)/*如果是閏年且月份大于2,總天數應該加一天*/ 
          421:    sum++;  
          422:   System.out.println("It is the the day:"+sum);
          423:   }
          424: }
          425: 【程序15】 題目:輸入三個整數x,y,z,請把這三個數由小到大輸出。  
          426: 1.程序分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x> y則將x與y的值進行交換,然后再用x與z進行比較,如果x> z則將x與z的值進行交換,這樣能使x最小。  
          427: import java.util.*;
          428: public class test {
          429:  public static void main (String[]args){
          430:   int i=0;
          431:   int j=0;
          432:   int k=0;
          433:   int x=0;
          434:   System.out.print("請輸入三個數\n");  
          435:   Scanner input = new Scanner(System.in);
          436:   i=input.nextInt();
          437:   j=input.nextInt();
          438:   k=input.nextInt();
          439:         if(i>j)
          440:         {
          441:           x=i;
          442:           i=j;
          443:           j=x;
          444:         }
          445:         if(i>k)
          446:         {
          447:           x=i;
          448:           i=k;
          449:           k=x;
          450:         }
          451:         if(j>k)
          452:         {
          453:           x=j;
          454:           j=k;
          455:           k=x;
          456:         }
          457:   System.out.println(i+", "+j+", "+k);
          458:  }
          459: }
          460: 【程序16】 題目:輸出9*9口訣。  
          461: 1.程序分析:分行與列考慮,共9行9列,i控制行,j控制列。  
          462: public class jiujiu {
          463: public static void main(String[] args)
          464: {
          465:  int i=0;
          466:  int j=0;
          467:  for(i=1;i<=9;i++)
          468:  { for(j=1;j<=9;j++)
          469:    System.out.print(i+"*"+j+"="+i*j+"\t");
          470:          System.out.println();
          471:  }
          472: }
          473: }
          474: 不出現重復的乘積(下三角)
          475: public class jiujiu {
          476: public static void main(String[] args)
          477: {
          478:  int i=0;
          479:  int j=0;
          480:  for(i=1;i<=9;i++)
          481:  { for(j=1;j<=i;j++)
          482:    System.out.print(i+"*"+j+"="+i*j+"\t");
          483:          System.out.println();
          484:  }
          485: }
          486: }
          487: 上三角
          488: public class jiujiu {
          489: public static void main(String[] args)
          490: {
          491:  int i=0;
          492:  int j=0;
          493:  for(i=1;i<=9;i++)
          494:  { for(j=i;j<=9;j++)
          495:    System.out.print(i+"*"+j+"="+i*j+"\t");
          496:          System.out.println();
          497:  }
          498: }
          499: }
          500: 【程序17】   題目:猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個   第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下   的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。  
          501: 1.程序分析:采取逆向思維的方法,從后往前推斷。  
          502: public class 猴子吃桃 {
          503:  static int total(int day){
          504:    if(day == 10){
          505:     return 1;
          506:    }
          507:    else{
          508:     return (total(day+1)+1)*2;
          509:    }
          510:   }
          511: public static void main(String[] args)
          512: {
          513:  System.out.println(total(1));
          514: }
          515: }
          516: 【程序18】   題目:兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊賽手的名單。  
          517: 1.程序分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,   則表明此數不是素數,反之是素數。  
          518: import java.util.ArrayList;
          519: public class pingpang {
          520:   String a,b,c;
          521:   public static void main(String[] args) {
          522:    String[] op = { "x", "y", "z" };
          523:    ArrayList<pingpang> arrayList=new ArrayList<pingpang>();
          524:    for (int i = 0; i < 3; i++)
          525:     for (int j = 0; j < 3; j++)
          526:      for (int k = 0; k < 3; k++) {
          527:       pingpang a=new pingpang(op[i],op[j],op[k]);
          528:       if(!a.a.equals(a.b)&&!a.b.equals(a.c)&&!a.a.equals("x")
          529:         &&!a.c.equals("x")&&!a.c.equals("z")){
          530:        arrayList.add(a);
          531:       }
          532:      }
          533:    for(Object a:arrayList){
          534:    System.out.println(a);
          535:    }
          536:   }
          537:   public pingpang(String a, String b, String c) {
          538:    super();
          539:    this.a = a;
          540:    this.b = b;
          541:    this.c = c;
          542:   }
          543:   @Override
          544:   public String toString() {
          545:    // TODO Auto-generated method stub
          546:    return "a的對手是"+a+","+"b的對手是"+b+","+"c的對手是"+c+"\n";
          547:   }
          548: }
          549: 【程序19】  題目:打印出如下圖案(菱形)  
          550: *  
          551: ***  
          552: ******  
          553: ********  
          554: ******  
          555: ***  
          556: *  
          557: 1.程序分析:先把圖形分成兩部分來看待,前四行一個規律,后三行一個規律,利用雙重   for循環,第一層控制行,第二層控制列。  
          558: 三角形:
          559: public class StartG {
          560:    public static void main(String [] args)
          561:    {
          562:     int i=0;
          563:     int j=0;
          564:     for(i=1;i<=4;i++)
          565:     {   for(j=1;j<=2*i-1;j++)
          566:       System.out.print("*");
          567:          System.out.println("");   
          568:     }
          569:        for(i=4;i>=1;i--)
          570:        { for(j=1;j<=2*i-3;j++)
          571:             System.out.print("*");
          572:           System.out.println("");   
          573:        }
          574:    }
          575:  }
          576:
          577: 菱形:
          578: public class StartG {
          579:    public static void main(String [] args)
          580:    {
          581:     int i=0;
          582:     int j=0;
          583:     for(i=1;i<=4;i++)
          584:     {
          585:      for(int k=1; k<=4-i;k++)
          586:        System.out.print(" ");
          587:      for(j=1;j<=2*i-1;j++)
          588:       System.out.print("*");
          589:      System.out.println("");   
          590:     }
          591:        for(i=4;i>=1;i--)
          592:        {
          593:      for(int k=1; k<=5-i;k++)
          594:         System.out.print(" ");
          595:         for(j=1;j<=2*i-3;j++)
          596:             System.out.print("*");
          597:          System.out.println("");   
          598:        }
          599:    }
          600:  }
          601:
          602: 【程序20】   題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。  
          603: 1.程序分析:請抓住分子與分母的變化規律。  
          604: public class test20 {
          605:  public static void main(String[] args) {
          606:   float fm = 1f;
          607:   float fz = 1f;
          608:   float temp;
          609:   float sum = 0f;
          610:   for (int i=0;i<20;i++){
          611:    temp = fm;
          612:    fm = fz;
          613:    fz = fz + temp;
          614:    sum += fz/fm;
          615:    //System.out.println(sum);
          616:   }
          617:   System.out.println(sum);
          618:  }
          619: }
          620: 【程序21】   題目:求1+2!+3!+...+20!的和  
          621: 1.程序分析:此程序只是把累加變成了累乘。  
          622: public class Ex21 {
          623:  static long sum = 0;
          624:  static long fac = 0;
          625:  public static void main(String[] args) {
          626:     long sum = 0;
          627:     long fac = 1;
          628:     for(int i=1; i<=10; i++) {
          629:      fac = fac * i;
          630:      sum += fac;
          631:     }
          632:     System.out.println(sum);
          633:  }
          634:  }
          635: 【程序22】   題目:利用遞歸方法求5!。  
          636: 1.程序分析:遞歸公式:fn=fn_1*4!  
          637: import java.util.Scanner;
          638: public class Ex22 {
          639: public static void main(String[] args) {
          640:    Scanner s = new Scanner(System.in);
          641:    int n = s.nextInt();
          642:    Ex22 tfr = new Ex22();
          643:    System.out.println(tfr.recursion(n));
          644:
          645: }
          646:
          647: public long recursion(int n) {
          648:    long value = 0 ;
          649:    if(n ==1 || n == 0) {
          650:     value = 1;
          651:    } else if(n > 1) {
          652:     value = n * recursion(n-1);
          653:    }
          654:    return value;
          655: }
          656:
          657: }
          658:
          659: 【程序23】   題目:有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最后問第一個人,他說是10歲。請問第五個人多大?  
          660: 1.程序分析:利用遞歸的方法,遞歸分為回推和遞推兩個階段。要想知道第五個人歲數,需知道第四人的歲數,依次類推,推到第一人(10歲),再往回推。  
          661: public class Ex23 {
          662:
          663:   static int getAge(int n){
          664:    if (n==1){
          665:     return 10;
          666:    }
          667:    return 2 + getAge(n-1);
          668:   }
          669:   public static void main(String[] args) {
          670:    System.out.println("第五個的年齡為:"+getAge(5));
          671:   }
          672:  }
          673: 【程序24】   題目:給一個不多于5位的正整數,要求:一、求它是幾位數,二、逆序打印出各位數字。  
          674: import java.util.Scanner;
          675: public class Ex24 {
          676: public static void main(String[] args) {
          677:    Ex24 tn = new Ex24();
          678:    Scanner s = new Scanner(System.in);
          679:    long a = s.nextLong();
          680:    if(a < 0 || a > 100000) {
          681:     System.out.println("Error Input, please run this program Again");
          682:     System.exit(0);
          683:    }
          684:     if(a >=0 && a <=9) {
          685:     System.out.println( a + "是一位數");
          686:     System.out.println("按逆序輸出是" + '\n' + a);
          687:    } else if(a >= 10 && a <= 99) {
          688:     System.out.println(a + "是二位數");
          689:     System.out.println("按逆序輸出是" );
          690:     tn.converse(a);
          691:    } else if(a >= 100 && a <= 999) {
          692:     System.out.println(a + "是三位數");
          693:     System.out.println("按逆序輸出是" );
          694:     tn.converse(a);
          695:    } else if(a >= 1000 && a <= 9999) {
          696:     System.out.println(a + "是四位數");
          697:     System.out.println("按逆序輸出是" );
          698:     tn.converse(a);
          699:    } else if(a >= 10000 && a <= 99999) {
          700:     System.out.println(a + "是五位數");
          701:     System.out.println("按逆序輸出是" );
          702:     tn.converse(a);
          703:    }
          704: }
          705: public void converse(long l) {
          706:    String s = Long.toString(l);
          707:    char[] ch = s.toCharArray();
          708:    for(int i=ch.length-1; i>=0; i--) {
          709:     System.out.print(ch[i]);
          710:    }
          711: }
          712: }
          713: 【程序25】   題目:一個5位數,判斷它是不是回文數。即12321是回文數,個位與萬位相同,十位與千位相同。  
          714: import java.util.Scanner;
          715: public class Ex25 {
          716: static int[] a = new int[5];
          717: static int[] b = new int[5];
          718: public static void main(String[] args) {
          719:    boolean is =false;
          720:    Scanner s = new Scanner(System.in);
          721:    long l = s.nextLong();
          722:    if (l > 99999 || l < 10000) {
          723:     System.out.println("Input error, please input again!");
          724:     l = s.nextLong();
          725:    }
          726:    for (int i = 4; i >= 0; i--) {
          727:     a[i] = (int) (l / (long) Math.pow(10, i));
          728:     l =(l % ( long) Math.pow(10, i));
          729:    }
          730:    System.out.println();
          731:    for(int i=0,j=0; i<5; i++, j++) {
          732:      b[j] = a[i];
          733:    }
          734:    for(int i=0,j=4; i<5; i++, j--) {
          735:     if(a[i] != b[j]) {
          736:      is = false;
          737:      break;
          738:     } else {
          739:      is = true;
          740:     }
          741:    }
          742:    if(is == false) {
          743:     System.out.println("is not a Palindrom!");
          744:    } else if(is == true) {
          745:     System.out.println("is a Palindrom!");
          746:    }
          747: }
          748: }
          749: 【程序26】   題目:請輸入星期幾的第一個字母來判斷一下是星期幾,如果第一個字母一樣,則繼續   判斷第二個字母。  
          750: 1.程序分析:用情況語句比較好,如果第一個字母一樣,則判斷用情況語句或if語句判斷第二個字母。  
          751: import java.util.Scanner;
          752: public class Ex26 {
          753:  public static void main(String[] args){
          754:   //保存用戶輸入的第二個字母
          755:   char weekSecond;
          756:   //將Scanner類示例化為input對象,用于接收用戶輸入
          757:   Scanner input = new Scanner(System.in);
          758:   //開始提示并接收用戶控制臺輸入
          759:   System.out.print("請輸入星期值英文的第一個字母,我來幫您判斷是星期幾:");
          760:   String letter = input.next();
          761:   //判斷用戶控制臺輸入字符串長度是否是一個字母
          762:   if (letter.length() == 1){
          763:    //利用取第一個索引位的字符來實現讓Scanner接收char類型輸入
          764:    char weekFirst = letter.charAt(0);
          765:    switch (weekFirst){
          766:   case 'm':
          767:      //當輸入小寫字母時,利用switch結構特性執行下一個帶break語句的case分支,以實現忽略用戶控制臺輸入大小寫敏感的功能
          768:     case 'M':
          769:       System.out.println("星期一(Monday)");
          770:      break;
          771:      case 't':
          772:      //當輸入小寫字母時,利用switch結構特性執行下一個帶break語句的case分支,以實現忽略用戶控制臺輸入大小寫敏感的功能
          773:     case 'T':
          774:       System.out.print("由于星期二(Tuesday)與星期四(Thursday)均以字母T開頭,故需輸入第二個字母才能正確判斷:");
          775:      letter = input.next();
          776:      //判斷用戶控制臺輸入字符串長度是否是一個字母
          777:      if (letter.length() == 1){
          778:       //利用取第一個索引位的字符來實現讓Scanner接收char類型輸入
          779:       weekSecond = letter.charAt(0);
          780:       //利用或(||)運算符來實現忽略用戶控制臺輸入大小寫敏感的功能
          781:       if (weekSecond == 'U' || weekSecond == 'u'){
          782:        System.out.println("星期二(Tuesday)");
          783:        break;
          784:       //利用或(||)運算符來實現忽略用戶控制臺輸入大小寫敏感的功能
          785:       } else if (weekSecond == 'H' || weekSecond == 'h'){
          786:        System.out.println("星期四(Thursday)");
          787:        break;
          788:       //控制臺錯誤提示
          789:       } else{
          790:        System.out.println("輸入錯誤,不能識別的星期值第二個字母,程序結束!");
          791:        break;
          792:       }
          793:      } else {
          794:       //控制臺錯誤提示
          795:       System.out.println("輸入錯誤,只能輸入一個字母,程序結束!");
          796:       break;
          797:      }
          798:     case 'w':
          799:      //當輸入小寫字母時,利用switch結構特性執行下一個帶break語句的case分支,以實現忽略用戶控制臺輸入大小寫敏感的功能
          800:     case 'W':
          801:      System.out.println("星期三(Wednesday)");
          802:      break;
          803:     case 'f':
          804:      //當輸入小寫字母時,利用switch結構特性執行下一個帶break語句的case分支,以實現忽略用戶控制臺輸入大小寫敏感的功能
          805:     case 'F':
          806:      System.out.println("星期五(Friday)");
          807:      break;
          808:     case 's':
          809:      //當輸入小寫字母時,利用switch結構特性執行下一個帶break語句的case分支,以實現忽略用戶控制臺輸入大小寫敏感的功能
          810:     case 'S':
          811:      System.out.print("由于星期六(Saturday)與星期日(Sunday)均以字母S開頭,故需輸入第二個字母才能正確判斷:");
          812:      letter = input.next();
          813:      //判斷用戶控制臺輸入字符串長度是否是一個字母
          814:      if (letter.length() == 1){
          815:       //利用取第一個索引位的字符來實現讓Scanner接收char類型輸入
          816:       weekSecond = letter.charAt(0);
          817:       //利用或(||)運算符來實現忽略用戶控制臺輸入大小寫敏感的功能
          818:       if (weekSecond == 'A' || weekSecond == 'a'){
          819:        System.out.println("星期六(Saturday)");
          820:        break;
          821:       //利用或(||)運算符來實現忽略用戶控制臺輸入大小寫敏感的功能
          822:       } else if (weekSecond == 'U' || weekSecond == 'u'){
          823:        System.out.println("星期日(Sunday)");
          824:        break;
          825:       //控制臺錯誤提示
          826:       } else{
          827:        System.out.println("輸入錯誤,不能識別的星期值第二個字母,程序結束!");
          828:        break;
          829:       }
          830:      } else{
          831:       //控制臺錯誤提示
          832:       System.out.println("輸入錯誤,只能輸入一個字母,程序結束!");
          833:       break;
          834:      }
          835:     default:
          836:      //控制臺錯誤提示
          837:      System.out.println("輸入錯誤,不能識別的星期值第一個字母,程序結束!");
          838:      break;
          839:    }
          840:   } else{
          841:    //控制臺錯誤提示
          842:    System.out.println("輸入錯誤,只能輸入一個字母,程序結束!");
          843:   }
          844:  }
          845: }
          846:
          847: 【程序27】   題目:求100之內的素數  
          848: public class Ex27 {
          849:  public static void main(String args[])
          850:  {
          851:   int sum,i;
          852:   for(sum=2;sum<=100;sum++)
          853:   {
          854:    for(i=2;i<=sum/2;i++)
          855:    {
          856:     if(sum%i==0)
          857:      break;
          858:    }
          859:    if(i>sum/2)
          860:     System.out.println(sum+"是素數");
          861:   }
          862:  }
          863: }
          864: 【程序28】   題目:對10個數進行排序  
          865: 1.程序分析:可以利用選擇法,即從后9個比較過程中,選擇一個最小的與第一個元素交換,   下次類推,即用第二個元素與后8個進行比較,并進行交換。  
          866: import java.util.Arrays;
          867: import java.util.Random;
          868: import java.util.Scanner;
          869: public class Ex28 {
          870:  public static void main(String[] args) {
          871:   int arr[] = new int[11];
          872:   Random r=new Random();
          873:   for(int i=0;i<10;i++){
          874:    arr[i]=r.nextInt(100)+1;//得到10個100以內的整數
          875:   }
          876:   Arrays.sort(arr);
          877:   for(int i=0;i<arr.length;i++){
          878:    System.out.print(arr[i]+"\t");
          879:   }
          880:   System.out.print("\nPlease Input a int number: ");
          881:   Scanner sc=new Scanner(System.in);
          882:   arr[10]=sc.nextInt();//輸入一個int值
          883:   Arrays.sort(arr);
          884:   for(int i=0;i<arr.length;i++){
          885:    System.out.print(arr[i]+"\t");
          886:   }
          887:  }
          888: }
          889: 【程序29】   題目:求一個3*3矩陣對角線元素之和  
          890: 1.程序分析:利用雙重for循環控制輸入二維數組,再將a[i][i]累加后輸出。  
          891: public class Ex29 {
          892:  public static void main(String[] args){
          893:  double sum=0;
          894:  int array[][]={{1,2,3},{4,5, 6},{7,7,8}};
          895:  for(int i=0;i<3;i++)
          896:     for(int j=0;j<3;j++){
          897:        if(i==j)
          898:          sum=sum + array[i][j];
          899:     }
          900:  System.out.println( sum); 
          901:  }
          902: }
          903: 【程序30】   題目:有一個已經排好序的數組。現輸入一個數,要求按原來的規律將它插入數組中。  
          904: 1.   程序分析:首先判斷此數是否大于最后一個數,然后再考慮插入中間的數的情況,插入后此元素之后的數,依次后移一個位置。  
          905: import java.util.Random;
          906: public class ArraySort {
          907:   public static void main(String[] args)
          908:   {  int temp=0;
          909:    int myarr[] = new int[12];
          910:    Random r=new Random();
          911:    for(int i=1;i<=10;i++)
          912:   myarr[i]=r.nextInt(1000);
          913:    for (int k=1;k<=10;k++)
          914:    System.out.print(myarr[k]+",");
          915:    for(int i=1;i<=9;i++)
          916:     for(int k=i+1;k<=10;k++)
          917:      if(myarr[i]>myarr[k])
          918:      {
          919:       temp=myarr[i];
          920:       myarr[i]=myarr[k];
          921:       myarr[k]=temp;
          922:      }
          923:       System.out.println("");
          924:    for (int k=1;k<=10;k++)
          925:     System.out.print(myarr[k]+",");
          926:  
          927:     myarr[11]=r.nextInt(1000);
          928:     for(int k=1;k<=10;k++)
          929:      if(myarr[k]>myarr[11])
          930:      {
          931:       temp=myarr[11];
          932:       for(int j=11;j>=k+1;j--)
          933:        myarr[j]=myarr[j-1];
          934:       myarr[k]=temp;
          935:      }
          936:       System.out.println("");  
          937:     for (int k=1;k<=11;k++)
          938:      System.out.print(myarr[k]+",");
          939:   }
          940: }
          941:
          942: 【程序31】   題目:將一個數組逆序輸出。  
          943: 程序分析:用第一個與最后一個交換。  
          944: 其實,用循環控制變量更簡單:
          945:     for(int k=11;k>=1;k--)
          946:      System.out.print(myarr[k]+",");
          947:
          948: 【程序32】   題目:取一個整數a從右端開始的4~7位。  
          949: 程序分析:可以這樣考慮:  
          950: (1)先使a右移4位。  
          951: (2)設置一個低4位全為1,其余全為0的數。可用~(~0 < <4)  
          952: (3)將上面二者進行&運算。 
          953:
          954: public class Ex32 {
          955:   public static void main(String[] args)
          956:   {
          957:  int a=0;
          958:  long b=18745678;
          959:  a=(int) Math.floor(b % Math.pow(10,7)/Math.pow(10, 3));
          960:  System.out.println(a);
          961:   }
          962:   }
          963: 【程序33】  
          964: 題目:打印出楊輝三角形(要求打印出10行如下圖)  
          965: 1.程序分析:  
          966: 1  
          967: 1   1  
          968: 1   2   1  
          969: 1   3   3   1  
          970: 1   4   6   4   1  
          971: 1   5   10   10   5   1  
          972: public class Ex33 {
          973:  public static void main(String args[]){
          974:      int i,j;
          975:      int a[][];
          976:      a=new int[8][8];
          977:     for(i=0;i<8;i++){
          978:        a[i][i]=1;
          979:        a[i][0]=1;
          980:       }
          981:     for(i=2;i<8;i++){
          982:      for(j=1;j<=i-1;j++){
          983:     a[i][j]=a[i-1][j-1]+a[i-1][j];
          984:      }
          985:     } 
          986:     for(i=0;i<8;i++){
          987:     for(j=0;j<i;j++){ 
          988:      System.out.printf("  "+a[i][j]);
          989:      }
          990:     System.out.println();
          991:     }
          992:    }
          993: }
          994:
          995: 【程序34】   題目:輸入3個數a,b,c,按大小順序輸出。  
          996: 1.程序分析:利用指針方法。  
          997: public class Ex34 {
          998:  public static void main(String[] args)
          999:  {
          1000:  int []arrays = {800,56,500};
          1001:  for(int i=arrays.length;--i>=0;)
          1002:  {
          1003:  for(int j=0;j<i;j++)
          1004:  {
          1005:  if(arrays[j]>arrays[j+1])
          1006:  {
          1007:  int temp=arrays[j];
          1008:  arrays[j]=arrays[j+1];
          1009:  arrays[j+1]=temp;
          1010:  }
          1011:  }
          1012:  }
          1013:  for(int n=0;n<arrays.length;n++)
          1014:  System.out.println(arrays[n]);
          1015:  }
          1016:
          1017: }
          1018: 【程序35】   題目:輸入數組,最大的與第一個元素交換,最小的與最后一個元素交換,輸出數組。  
          1019: import java.util.*;
          1020: public class Ex35 {
          1021: public static void main(String[] args) {
          1022: int i, min, max, n, temp1, temp2;
          1023: int a[];
          1024: System.out.println("輸入數組的長度:");
          1025: Scanner keyboard = new Scanner(System.in);
          1026: n = keyboard.nextInt();
          1027: a = new int[n];
          1028: for (i = 0; i < n; i++) {
          1029: System.out.print("輸入第" + (i + 1) + "個數據");
          1030: a[i] = keyboard.nextInt();
          1031: }
          1032: //以上是輸入整個數組
          1033: max = 0;
          1034: min = 0;
          1035: //設置兩個標志,開始都指向第一個數
          1036: for (i = 1; i < n; i++) {
          1037: if (a[i] > a[max])
          1038: max = i; //遍歷數組,如果大于a[max],就把他的數組下標賦給max
          1039: if (a[i] < a[min])
          1040: min = i; //同上,如果小于a[min],就把他的數組下標賦給min
          1041: }
          1042: //以上for循環找到最大值和最小值,max是最大值的下標,min是最小值的下標
          1043: temp1 = a[0];
          1044: temp2 = a[min]; //這兩個temp只是為了在交換時使用
          1045:
          1046: a[0] = a[max];
          1047: a[max] = temp1; //首先交換a[0]和最大值a[max]
          1048:
          1049: if (min != 0) { //如果最小值不是a[0],執行下面
          1050: a[min] = a[n - 1];
          1051: a[n - 1] = temp2; //交換a[min]和a[n-1]
          1052: } else {       //如果最小值是a[0],執行下面
          1053: a[max] = a[n - 1];
          1054: a[n - 1] = temp1;
          1055: }
          1056:
          1057: for (i = 0; i < n; i++) { //輸出數組
          1058: System.out.print(a[i] + " ");
          1059: }
          1060: }
          1061: }
          1062: 【程序36】   題目:有n個整數,使其前面各數順序向后移m個位置,最后m個數變成最前面的m個數 
          1063:
          1064:
          1065: 【程序37】  
          1066: 題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。  
          1067: import java.util.Scanner;
          1068: public class Ex37 {
          1069:  public static void main(String[] args) {
          1070:      Scanner s = new Scanner(System.in);
          1071:      int n = s.nextInt();
          1072:      boolean[] arr = new boolean[n];
          1073:      for(int i=0; i<arr.length; i++) {
          1074:       arr[i] = true;//下標為TRUE時說明還在圈里
          1075:      }
          1076:      int leftCount = n;
          1077:      int countNum = 0;
          1078:      int index = 0;
          1079:      while(leftCount > 1) {
          1080:       if(arr[index] == true) {//當在圈里時
          1081:        countNum ++; //報數遞加
          1082:        if(countNum == 3) {//報道3時
          1083:         countNum =0;//從零開始繼續報數
          1084:         arr[index] = false;//此人退出圈子
          1085:         leftCount --;//剩余人數減一
          1086:        }
          1087:       }
          1088:       index ++;//每報一次數,下標加一
          1089:       if(index == n) {//是循環數數,當下標大于n時,說明已經數了一圈,
          1090:        index = 0;//將下標設為零重新開始。
          1091:       }
          1092:      }
          1093:      for(int i=0; i<n; i++) {
          1094:       if(arr[i] == true) {
          1095:        System.out.println(i);
          1096:       }
          1097:      }
          1098:      }
          1099: }
          1100:
          1101: 【程序38】  
          1102: 題目:寫一個函數,求一個字符串的長度,在main函數中輸入字符串,并輸出其長度。  
          1103: import java.util.Scanner;
          1104: public class Ex38 {
          1105: public static void main(String [] args)
          1106: {
          1107:  Scanner s = new Scanner(System.in);
          1108:  System.out.println("請輸入一個字符串");
          1109:  String mys= s.next();
          1110:  System.out.println(str_len(mys));
          1111: }
          1112:   public static int str_len(String x)
          1113:   {
          1114:    return x.length();
          1115:   }
          1116: }
          1117:
          1118:
          1119:  
          1120: 題目:編寫一個函數,輸入n為偶數時,調用函數求1/2+1/4+...+1/n,當輸入n為奇數時,調用函數1/1+1/3+...+1/n
          1121:
          1122: 【程序39】 
          1123: 題目:字符串排序。 
          1124:
          1125: import java.util.*;  
          1126: public class test{
          1127:  public   static   void   main(String[]   args)
          1128:  {  
          1129:      ArrayList<String> list=new ArrayList<String>();  
          1130:      list.add("010101");  
          1131:      list.add("010003");  
          1132:     list.add("010201");  
          1133:     Collections.sort(list);  
          1134:   for(int   i=0;i<list.size();i++){  
          1135:   System.out.println(list.get(i));  
          1136:   }  
          1137:   }  
          1138:   }
          1139:
          1140: 【程序40】  
          1141: 題目:海灘上有一堆桃子,五只猴子來分。第一只猴子把這堆桃子憑據分為五份,多了一個,這只猴子把多的一個扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,第三、第四、第五只猴子都是這樣做的,問海灘上原來最少有多少個桃子? 
          1142:
          1143: public class Dg {
          1144: static int ts=0;//桃子總數
          1145: int fs=1;//記錄分的次數
          1146: static int hs=5;//猴子數...
          1147: int tsscope=5000;//桃子數的取值范圍.太大容易溢出.
          1148: public int fT(int t){
          1149: if(t==tsscope){
          1150: //當桃子數到了最大的取值范圍時取消遞歸
          1151: System.out.println("結束");
          1152: return 0;
          1153: }
          1154: else{
          1155: if((t-1)%hs==0 && fs <=hs){
          1156: if(fs==hs)
          1157: {
          1158: System.out.println("桃子數 = "+ts +" 時滿足分桃條件");
          1159: }
          1160:    fs+=1;
          1161:    return fT((t-1)/5*4);// 返回猴子拿走一份后的剩下的總數
          1162: }
          1163: else
          1164: {
          1165: //沒滿足條件
          1166: fs=1;//分的次數重置為1
          1167: return fT(ts+=1);//桃子數加+1
          1168: }
          1169: }
          1170: }
          1171: public static void main(String[] args) {
          1172: new Dg().fT(0);
          1173: }
          1174:
          1175: }
          主站蜘蛛池模板: 策勒县| 海丰县| 遂川县| 碌曲县| 房产| 新余市| 福贡县| 张北县| 郁南县| 息烽县| 乌兰县| 成安县| 深州市| 稷山县| 京山县| 临沂市| 招远市| 金溪县| 梨树县| 四平市| 维西| 林周县| 荥阳市| 林州市| 左云县| 阿坝县| 木兰县| 名山县| 海淀区| 香格里拉县| 美姑县| 张家川| 武陟县| 萨迦县| 黄山市| 新昌县| 神农架林区| 东城区| 新河县| 云和县| 乌海市|