java基础算法题

为了提高自己的代码能力和算法能力,我决定每天学习一道算法题,吸收前辈思想。

【程序1】 TestRabbit.java
    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

程序分析:兔子数量的规律为数列:1,1,2,3,5,8,13.....其实就是斐波那契数列  使用递归就可以实现

 1 /**
 2  * 兔子问题
 3  * 2016/5/9
 4  * 斐波那契数列求值
 5  *题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,
 6  *小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
 7  *程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
 8  */
 9 package org;
10 
11 import java.util.Scanner;
12 public class TestRabbit {
13 
14     public static void main(String[] args) {
15         Scanner input = new Scanner(System.in);
16         int n = input.nextInt();
17         int num = fun(n);
18         System.out.println("第"+n+"个月的兔子总数为:"+num);
19     }
20 
21     public static int fun(int n){
22         if(n == 1 || n ==2){
23             return 1;
24         }else{
25             return (fun(n-1) + fun(n-2));
26         }
27         
28     }
29 
30 }
TestRabbit.java

 

【程序2】DaffodilsNum.java

    题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如: 
        153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

 1 /**
 2  *  题目:水仙花数
 3  *  打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
 4  *  例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 
 5  *
 6  * 2016/5/10
 7  */
 8 package org;
 9 
10 public class DaffodilsNum {
11 
12     public static void main(String[] args) {
13         for(int i = 100; i <= 999; i++){
14             int a = i % 10;        //个位数
15             int b = (i / 10) % 10;        //十位数
16             int c = i / 100;            //百位数
17             int sum = a*a*a +b*b*b + c*c*c;
18             if(i == sum){
19                 System.out.println("水仙花数:"+i);
20             }
21         }
22     }
23 }
DaffodilsNum.java

 

【程序3FenJie.java
    题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

 

 1 /**
 2  * 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 
 3  * 2016/5/11
 4  */
 5 package org;
 6 
 7 import java.util.Scanner;
 8 
 9 public class FenJie {
10 
11     public static void main(String[] args) {
12          Scanner input = new Scanner(System.in);
13          int num1 = input.nextInt();
14          int num = num1;
15          int k = 2;
16          //方法一:循环
17          while(num > k){
18              if(num % k ==0){
19                  System.out.print(k + " * ");
20                  num = num / k;
21              } else{
22                  k++;
23              }
24          }
25          System.out.print(k);
26          System.out.println();
27         // 方法二:递归
28          fun(num1);
29 
30     }
31 
32     public static void fun(int num){
33         int i ;
34         if(num == 1 ){
35             return;
36         }else{
37             for(i = 2; i <= num; i++){
38                 if(num % i ==0){
39                     System.out.print(i + " * ");
40                     break;
41                 }
42             }
43             fun(num/i);
44         }
45 
46     }
47 
48 }
FenJie

 

【程序4GcdTest.java后者是辗转相除法
    题目:输入两个正整数mn,求其最大公约数和最小公倍数。

 1 /**
 2  * 求其最大公约数和最小公倍数。 
 3  * 2016/5/12
 4  */
 5 
 6 package org;
 7 
 8 public class GcdTest {
 9 
10     public static void main(String[] args) {
11         int a = 18;
12         int b = 124;
13         int a_x = a;
14         int b_x = b;
15         //保证a  > b
16         if( a < b ){
17             int num = a;
18             a = b;
19             b = num;
20         }
21         int num = b;
22         do{
23             if (a % b == 0){
24                 System.out.println("最大公约数为:" + b);
25                 System.out.println("最小公倍数为"+a_x*b_x/b);
26                 return;
27             }else{
28                 num = a % b; 
29                 a = b;
30                 b = num;
31             }
32         }while(b != 0);
33 
34     }
35 
36 }
View Code

 

【程序5 StChar.java
    题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

 1 /**
 2  * 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
 3  * 2016/5/13
 4  */
 5 package org;
 6 
 7 import java.util.Scanner;
 8 public class StrIdentify {
 9 
10     public static void main(String[] args) {
11         int letter = 0;
12         int number = 0;
13         int blank = 0;
14         int other = 0;
15         Scanner input = new Scanner(System.in);
16         String str = input.nextLine();
17         char[] ch = str.toCharArray();
18         for(int i = 0; i < ch.length; i++){
19         
20             if (Character.isLetter(ch[i])){        //字母
21                 letter++;
22             } else if(Character.isDigit(ch[i])){        //数字
23                 number++;
24             }else if(Character.isSpaceChar(ch[i])){        //空格
25                 blank++;
26             } else{                            //其他
27                 other++;
28             }
29         }
30         System.out.println("字母个数为: " + letter);
31         System.out.println("数字个数为: " + number);
32         System.out.println("空格个数为: " + blank);
33         System.out.println("其他字符个数为: " + other);
34     }
35 
36 }
View Code

 

【程序6】 TestAdd.java
    题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

 1 /**
 2  * java 
 3  * 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
 4  * 例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
 5  *( 201265
 6  **/ 
 7 package org;
 8 
 9 import java.util.Scanner;
10 public class TestAdd {
11     public static void main(String[] args) {
12         Scanner input = new Scanner(System.in);
13         System.out.println("请输入两个数,第一个数表示这些相同的数字,第二个数表示共有几个数相加");
14         System.out.println("请输入数字0-9");
15         int num_x = input.nextInt();
16         System.out.println("请输入有多少个数相加");
17         int n = input.nextInt();
18         int sum = 0;
19         for(int i = 0; i < n; i++){
20             sum += ( num_x * (n-i) * Math.pow(10,i));
21         }
22         System.out.println("这些数相加的和为: " + sum);
23 
24 
25     }
26 
27 }
View Code

 

【程序7】 WanShu.java
    题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。

 1 /**
 2  * java 完数
 3  * 2016/5/16
 4  **/
 5 package org;
 6 
 7 import java.util.Scanner;
 8 public class WanShu {
 9 
10     public static void main(String[] args) {
11         for(int i = 1; i <= 1000; i++){
12             Wanshu(i);
13         }
14     }
15 
16     public static void Wanshu(int n){
17         
18         int num = 1;
19         for(int i = 2; i < n; i ++){
20             if( n % i == 0 ){
21                 num += i;
22             }
23         }
24         if(num == n){
25             System.out.println("完数: " + n);
26 
27         }
28 
29     }
30 
31 }
View Code

 

【程序8TestBall.java
    题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

 1 /**
 2  * 2016/5/17
 3  * 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
 4  */
 5 package org;
 6 
 7 public class TestBall {
 8     public static void main(String[] args) {
 9 
10         double a = 100;
11         double sum = 100;
12         for (int i = 2; i <= 10; i++) {
13             a = a * 0.5;
14             sum = sum + a * 2;
15         }
16         System.out.println("10次共反弹" + sum + "米; 反弹距离:"+ a);
17     }
18 }
View Code

 

【程序9 TestTN.java
    题目:有1234个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

 1 /**
 2  * 2016/5/18
 3  *    题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 
 4  */
 5 package org;
 6 
 7 public class TestTN {
 8     public static void main(String [] args){
 9         int a;
10         int b;
11         int c;
12         int num = 0;
13         for(a = 1; a < 5; a++){
14             for(b = 1; b < 5; b++){
15                 for(c = 1; c < 5; c++){
16                     if(a != b && b != c && a != c){
17                         num++;
18                         System.out.println("第" + num + "个数:" + a + b +c);
19                     }
20                 }
21             }
22         }
23     }
24 }
View Code

 

【程序10FindNumber.java
    题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?(只在十万以内讨论)

 1 /**
 2  *  2016/5/19
 3  * 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 
 4  */
 5 package org;
 6 
 7 public class FindNumber {
 8     public static void main(String[] args){
 9         for(int i = 1; i <= 100000;  i++){
10             if(Math.sqrt(i + 100) % 1 == 0 && Math.sqrt(i +168) % 1 == 0){
11                 System.out.println(i);
12             }
13         }
14     }
15 }
View Code

 

 【程序11题目:输入某年某月某日,判断这一天是这一年的第几天?

 1 /**
 2  * 2016/5/20
 3  * 题目:输入某年某月某日,判断这一天是这一年的第几天?
 4  */
 5 package org;
 6 
 7 import java.util.Scanner;
 8 
 9 public class TestDay {
10     public static void main(String[] args){
11         System.out.println("请输入日期:(用空格隔开)");
12         Scanner input = new Scanner(System.in);
13         int year = input.nextInt();
14         int month = input.nextInt();
15         int day = input.nextInt();
16         int dayNumber = 0;
17         if((year % 4 ==0 && year % 100 == 0) || year % 400 == 0){ //闰年
18             int day_num[] = {31,28,31,30,31,30,31,31,30,31,30,31};
19             for(int i = 1; i < month; i++){
20                 dayNumber += day_num[i];
21             }
22             dayNumber += day;
23         }else{
24             int day_num[] = {31,29,31,30,31,30,31,31,30,31,30,31};
25             for(int i = 1; i < month; i++){
26                 dayNumber += day_num[i];
27             }
28             dayNumber += day;
29         }
30         System.out.println(year + "年" + month +"月" + day + "日是" + year + "的第" + dayNumber +"天~~" );
31     }
32 }
View Code

 

【程序12Nine.java
    题目:输出9*9口诀。

 1 /**
 2  * 2016/5/21
 3  *  题目:输出9*9口诀。 
 4  */
 5 package org;
 6 
 7 public class Nine {
 8     public static void main(String[] args) {
 9         for (int i = 0; i < 10; i++) {
10             for (int j = 0; j <= i; j++) {
11                 System.out.print(i + "*" + j + "=" +i * j + " " + "\t");
12             }
13             System.out.println();
14         }
15     }
16 }
View Code

 

【程序13MonkeyEatPeach.java
    题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天      剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

 

 1 /**
 2  * 2016/5/22
 3  * 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,
 4  * 又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天 
 5  * 剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 
 6  */
 7 package org;
 8 
 9 public class MonkeyEatPeach {
10     public static void main(String[] args){
11         int num = 1;
12         System.out.println("第" + 10 + "天剩余的桃子:" + num);
13         for (int i = 9; i >= 1; i--){
14             num = (num + 1) * 2;
15             System.out.println("第" + i + "天剩余的桃子:" + num);
16         }
17         System.out.println(num);
18     }
19 
20 }
View Code

 

【程序14LingXing.java 
    题目:打印出如下图案
    *
    ***
    ******
    ********
     ******
         ***
           *

 1 /**
 2  * 2016/5/23
 3  *   题目:打印出如下图案(菱形) 
 4  *   *
 5  *   ***
 6  *   ******
 7  *   ********
 8  *     ******
 9  *           ***
10  *              *
11  */
12 package org;
13 
14 public class LingXing {
15     public static void main(String[] args){
16         int[] arr = { 1, 3, 6, 8, 6, 3, 1 };
17         int[] arr_x = {2,8,11};
18         for (int i = 0; i < 4; i++) {
19             for (int j = 0; j < arr[i]; j++) {
20                 System.out.print("*");
21             }
22             System.out.println("");
23         }
24         for (int i = 4; i < arr.length; i++) {
25             for (int j = 0; j < arr_x[i-4]; j++) {
26                 System.out.print(" ");
27             }
28             for (int j = 0; j < arr[i]; j++) {
29                 System.out.print("*");
30             }
31             System.out.println("");
32         }
33     }
34 }
View Code

 

 【程序15TestAdd2.java
    题目:有一分数序列:2/13/25/38/513/821/13...求出这个数列的前20项之和。

 1 /**
 2  * 2016/5/24
 3  *  题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。 
 4  */
 5 package org;
 6 
 7 public class TestAdd2 {
 8     public static void main(String[] args){
 9         double x = 2.0;
10         double y = 1;
11         double sum = 2.0;
12         System.out.print(x + "/" + y + " ");
13         for(int i = 0; i < 20; i++){
14             double y_1 = y;
15             y = x;
16             x = x + y_1;
17             sum = sum + x/y;
18 //            System.out.print(x + "/" + y + " ");
19         }
20         System.out.println("\n 总和:" + sum);
21     }
22     
23 }
View Code

 

 【程序16TestJieCheng.java
    题目:求1+2!+3!+...+20!的和

 1 /**
 2  * 2016/5/25
 3  *   题目:求1+2!+3!+...+20!的和 
 4  *
 5  */
 6 package org;
 7 
 8 public class TestJieCheng {
 9     public static void main(String[] args){
10         int sum = 0;
11         int data = 1;
12         for(int i = 1; i <= 20; i++){
13             data = data*i;
14             sum += data;
15         }
16         System.out.println(sum);
17     }
18 }
View Code

 

【程序17TestAge.java
    题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大      两岁。最后问第一个人,他说是10岁。请问第五个人多大?

 1 /**
 2  * 2016/5/25
 3  * 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。
 4  *    问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大
 5  *    两岁。最后问第一个人,他说是10岁。请问第五个人多大? 
 6  */
 7 package org;
 8 
 9 import sun.management.Agent;
10 
11 public class TestAge {
12     public static void main(String[] args){
13         System.out.println(Age(5));
14     }
15     public static int Age(int n){
16         if(n == 1){
17             return 10;
18         }else{
19             return 2+Age(n - 1);
20         }
21     }
22 
23 }
View Code

 

【程序18TestNumber.java
    题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

 1 /**
 2  * 2016/5/26
 3  *   题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
 4  */
 5 package org;
 6 
 7 public class TestNumber {
 8     public static void main(String[] args){
 9         int num = (int)(1 + Math.random()*(10000 - 1 +1));
10         System.out.println(num+ " ");
11         String num_string = num+"";
12         System.out.println("位数:" + num_string.length());
13         char[] num_char = num_string.toCharArray();
14         for(int i = num_string.length()-1; i >= 0; i--){
15             System.out.print(num_char[i]);
16         }
17     }
18 }
View Code

 

【程序19】 SuShu.java
    题目:求100之内的素数

 

 1 /**
 2  * 2016/5/27
 3  * 题目:求100之内的素数
 4  */
 5 package org;
 6 public class SuShu {
 7     public static void main(String[] args){
 8         int a;//标记
 9         System.out.println(2 + " ");
10         for(int i = 1; i <= 100; i+=2){
11             a = 1;
12             for(int j = 2; j < i; j++){
13                 if(i % j == 0) {
14                     a = -1;
15                     break;
16                 }
17             }
18             if(a == 1){
19                 System.out.println(i + " ");
20             }
21         }
22     }
23 }
View Code

 

 【程序20YangHui.java
    题目:打印出杨辉三角形(要求打印出10行如下图)
         1
        1  1
       1  2  1
      1  3  3  1
     1  4  6  4  1
    1  5  10 10  5  1

 

 

 

 

 

 

 


posted on 2016-05-09 23:56  snail-lb  阅读(453)  评论(0编辑  收藏  举报