JAVA经典算法40题

 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: }
上一篇:JAVA经典算法40题及解答


下一篇:PHP-HTML重要知识点笔记