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 }
【程序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 }
【程序3】FenJie.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 }
【程序4】GcdTest.java后者是辗转相除法
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
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 }
【程序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 }
【程序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 }
【程序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 }
【程序8】TestBall.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 }
【程序9】 TestTN.java
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
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 }
【程序10】FindNumber.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 }
【程序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 }
【程序12】Nine.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 }
【程序13】MonkeyEatPeach.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 }
【程序14】LingXing.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 }
【程序15】TestAdd2.java
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/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 }
【程序16】TestJieCheng.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 }
【程序17】TestAge.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 }
【程序18】TestNumber.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 }
【程序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 }
【程序20】YangHui.java
题目:打印出杨辉三角形(要求打印出10行如下图)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1