java基础算法题

时间:2023-12-23 11:29:02

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

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

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

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

TestRabbit.java

【程序2】DaffodilsNum.java

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

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

DaffodilsNum.java

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

 /**
* 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
* 2016/5/11
*/
package org; import java.util.Scanner; public class FenJie { public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num1 = input.nextInt();
int num = num1;
int k = 2;
//方法一:循环
while(num > k){
if(num % k ==0){
System.out.print(k + " * ");
num = num / k;
} else{
k++;
}
}
System.out.print(k);
System.out.println();
// 方法二:递归
fun(num1); } public static void fun(int num){
int i ;
if(num == 1 ){
return;
}else{
for(i = 2; i <= num; i++){
if(num % i ==0){
System.out.print(i + " * ");
break;
}
}
fun(num/i);
} } }

FenJie

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

 /**
* 求其最大公约数和最小公倍数。
* 2016/5/12
*/ package org; public class GcdTest { public static void main(String[] args) {
int a = 18;
int b = 124;
int a_x = a;
int b_x = b;
//保证a > b
if( a < b ){
int num = a;
a = b;
b = num;
}
int num = b;
do{
if (a % b == 0){
System.out.println("最大公约数为:" + b);
System.out.println("最小公倍数为"+a_x*b_x/b);
return;
}else{
num = a % b;
a = b;
b = num;
}
}while(b != 0); } }

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

 /**
* 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
* 2016/5/13
*/
package org; import java.util.Scanner;
public class StrIdentify { public static void main(String[] args) {
int letter = 0;
int number = 0;
int blank = 0;
int other = 0;
Scanner input = new Scanner(System.in);
String str = input.nextLine();
char[] ch = str.toCharArray();
for(int i = 0; i < ch.length; i++){ if (Character.isLetter(ch[i])){ //字母
letter++;
} else if(Character.isDigit(ch[i])){ //数字
number++;
}else if(Character.isSpaceChar(ch[i])){ //空格
blank++;
} else{ //其他
other++;
}
}
System.out.println("字母个数为: " + letter);
System.out.println("数字个数为: " + number);
System.out.println("空格个数为: " + blank);
System.out.println("其他字符个数为: " + other);
} }

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

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

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

 /**
* java 完数
* 2016/5/16
**/
package org; import java.util.Scanner;
public class WanShu { public static void main(String[] args) {
for(int i = 1; i <= 1000; i++){
Wanshu(i);
}
} public static void Wanshu(int n){ int num = 1;
for(int i = 2; i < n; i ++){
if( n % i == 0 ){
num += i;
}
}
if(num == n){
System.out.println("完数: " + n); } } }

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

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

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

 /**
* 2016/5/18
*    题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
*/
package org; public class TestTN {
public static void main(String [] args){
int a;
int b;
int c;
int num = 0;
for(a = 1; a < 5; a++){
for(b = 1; b < 5; b++){
for(c = 1; c < 5; c++){
if(a != b && b != c && a != c){
num++;
System.out.println("第" + num + "个数:" + a + b +c);
}
}
}
}
}
}

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

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

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

 /**
* 2016/5/20
* 题目:输入某年某月某日,判断这一天是这一年的第几天?
*/
package org; import java.util.Scanner; public class TestDay {
public static void main(String[] args){
System.out.println("请输入日期:(用空格隔开)");
Scanner input = new Scanner(System.in);
int year = input.nextInt();
int month = input.nextInt();
int day = input.nextInt();
int dayNumber = 0;
if((year % 4 ==0 && year % 100 == 0) || year % 400 == 0){ //闰年
int day_num[] = {31,28,31,30,31,30,31,31,30,31,30,31};
for(int i = 1; i < month; i++){
dayNumber += day_num[i];
}
dayNumber += day;
}else{
int day_num[] = {31,29,31,30,31,30,31,31,30,31,30,31};
for(int i = 1; i < month; i++){
dayNumber += day_num[i];
}
dayNumber += day;
}
System.out.println(year + "年" + month +"月" + day + "日是" + year + "的第" + dayNumber +"天~~" );
}
}

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

 /**
* 2016/5/21
*  题目:输出9*9口诀。
*/
package org; public class Nine {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j <= i; j++) {
System.out.print(i + "*" + j + "=" +i * j + " " + "\t");
}
System.out.println();
}
}
}

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

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

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

 /**
* 2016/5/23
 *   题目:打印出如下图案(菱形)
 *   *
 *   ***
 *   ******
 *   ********
 *     ******
 *    ***
 *    *
*/
package org; public class LingXing {
public static void main(String[] args){
int[] arr = { 1, 3, 6, 8, 6, 3, 1 };
int[] arr_x = {2,8,11};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < arr[i]; j++) {
System.out.print("*");
}
System.out.println("");
}
for (int i = 4; i < arr.length; i++) {
for (int j = 0; j < arr_x[i-4]; j++) {
System.out.print(" ");
}
for (int j = 0; j < arr[i]; j++) {
System.out.print("*");
}
System.out.println("");
}
}
}

【程序15】TestAdd2.java
    题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

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

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

 /**
* 2016/5/25
 *   题目:求1+2!+3!+...+20!的和
*
*/
package org; public class TestJieCheng {
public static void main(String[] args){
int sum = 0;
int data = 1;
for(int i = 1; i <= 20; i++){
data = data*i;
sum += data;
}
System.out.println(sum);
}
}

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

 /**
* 2016/5/25
 * 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。
* 问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大
* 两岁。最后问第一个人,他说是10岁。请问第五个人多大?
*/
package org; import sun.management.Agent; public class TestAge {
public static void main(String[] args){
System.out.println(Age(5));
}
public static int Age(int n){
if(n == 1){
return 10;
}else{
return 2+Age(n - 1);
}
} }

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

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

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

 /**
* 2016/5/27
 * 题目:求100之内的素数
*/
package org;
public class SuShu {
public static void main(String[] args){
int a;//标记
System.out.println(2 + " ");
for(int i = 1; i <= 100; i+=2){
a = 1;
for(int j = 2; j < i; j++){
if(i % j == 0) {
a = -1;
break;
}
}
if(a == 1){
System.out.println(i + " ");
}
}
}
}

 【程序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