java算法大全

时间:2024-04-22 00:04:29

题一:

/**
 * 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,
 * 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少对?
 * 分析:
 * 第一个月:1对
 * 第二个月:1对
 * 第三个月:2对
 * 第四个月:3对
 * 第五个月:5对
 * 第六个月:8对
 * ...
 * 第n个月:n>2时,f(n)=f(n-1)+f(n-2),即满足斐波那契数列
 */
public class Arithmetic01 {
 public static void main(String[] args) {
  for (int n = 1; n <= 12; n++){
   System.out.println(f(n));
  }
 }
 public static int f(int n) {
  if (n == 1 || n == 2){
   return 1;
  }
  return f(n - 1) + f(n - 2);
 }
}

题二:

/**
 * 题目:判断101-200之间有多少个素数,并输出所有素数。
 * 分析:
 * 所谓素数(也称质数),是指除了自己和它本身外没有其他的约数。
 */
public class Arithmetic02 {
 public static void main(String[] args) {
  boolean isPrime = false;
  System.out.println("101-200之间的素数有:");
  for(int i=101;i<=200;i+=2){//i+=2是为了提高效率,因为毕竟偶数不会是素数
   for(int j=2;j<=Math.sqrt(i);j++){
    if(i%j==0){
     isPrime = false;
     break;
    }
    isPrime = true;
   }
   if(isPrime){
    System.out.println(i); 
   }
  }
 }
}

题目三:

/**
 * 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。
 * 例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
 * 分析:
 * 既然是三位数,那么范围必定可缩小为100~999
 */
public class Arithmetic03 {
 public static void main(String[] args) {
  System.out.println("所有的水仙花数是:");
  for(int i=100;i<=999;i++){
   int g = i%10;//个位
   int s = i/10%10;//十位
   int b = i/100;//百位
   if(i== g*g*g+s*s*s+b*b*b){
    System.out.println(i);
   }
  }
 }
}

题目四:

/**

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

* 分析:

* 对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

* (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

* (2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你,重复执行第一步。

* (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

*/

public class Arithmetic04 {

public static void main(String[] args) {

String str = "";

Arithmetic04 c = new Arithmetic04();

str = javax.swing.JOptionPane.showInputDialog("请输入N的值(输入exit退出):");

int N = 0;

try {

  N = Integer.parseInt(str);

} catch (NumberFormatException e) {

   e.printStackTrace();

}

System.out.print(N + "分解质因数:" + N + "=");

c.resolve(N);

}

public void resolve(int n) {

for (int i = 2; i <= n / 2; i++) {

if (n % i == 0) {

  System.out.print(i + "*");

resolve(n / i);

}

}

System.out.print(n);

System.exit(0);// /不能少这句,否则结果会出错

}

}

题目五:

/**
 * 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,
 * 60-89分之间的用B表示,60分以下的用C表示
 * 分析:
 * 本题目的重点在于利用条件运算符
 */
public class Arithmetic05 {
 public static void main(String[] args) {
  System.out.println(getGrade(59));
 }
 public static String getGrade(int score){
  return score>=90?"A":(score<60?"C":"B");
 }
}

题目六:

import java.util.Scanner;
/**
 * 题目:输入两个正整数m和n,求其最大公约数和最小公倍数 分析:
 * 分析:
 * 1.利用辗除法求出最大公约数
 * 2.清楚概念:a,b的最小公倍数=a*b/(a,b的最大公约数)
 */
public class Arithmetic06 {
 // 下面的方法是求出最大公约数
 public static int gcd(int m, int n) {
  while (true) {
   if ((m = m % n) == 0)
    return n;
   if ((n = n % m) == 0)
    return m;
  }
 }
 public static void main(String args[]) throws Exception {
  // 取得输入值
  Scanner chin = new Scanner(System.in);
  int a = chin.nextInt();
  int b = chin.nextInt();
  int c = gcd(a, b);
  System.out.println("最小公倍数:" + a * b / c + "\n最大公约数:" + c);
 }
}

题目七:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

/**

* 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。

* 例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

* 分析:

* 解一,利用字符串相加构造,例如:3,"3"+"3"构造成33,,,

* 解二,利用循环构造个十百,,,位

*/

public class Arithmetic07 {

// 解一,

// public static void main(String[] args) throws IOException {

//  int s = 0;

//  String output = "";

//  BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in));

//  System.out.println("请输入a的值");

//  String input = stadin.readLine();

//  for (int i = 1; i <= Integer.parseInt(input); i++) {

//   output += input;

//   int a = Integer.parseInt(output);

//   s += a;

//  }

//  System.out.println(s);

// }

// 解二,

public static void main(String[] args) throws IOException {

int s = 0;

int n = 0;

int t = 0;

BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in));

String input = stadin.readLine();

n = Integer.parseInt(input);

for (int i = 1; i <= n; i++) {

t = t * 10 + n;

s= s + t;

}

System.out.println(s);

}

}

题目八:

/**
 * 题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。
 * 例如6=1+2+3.编程找出1000以内的所有完数。
 * 分析:
 */
public class Arithmetic08 {
 public static void main(String[] args) {
  int s;
  for (int i = 1; i <= 1000; i++) {
   s = 0;
   for (int j = 1; j <= i/2; j++) {
    if (i % j == 0) {
     s = s + j;
    }
   }
   if (s == i) {
    System.out.print(i + " ");
   }
  }
 }
}

题目九:

/**
 * 一球从100米高度*落下,每次落地后反跳回原高度的一半;
 * 再落下,求它在第10次落地弹起到最高点时,共经过多少米?第10次反弹多高?
 * 分析:
 * 1.先分析反弹高度,为hign(n)=100/Math.pow(2,n)
 * 2.经过总路线长度sum
 * 第一次:f(1)=100+50=100+high(1)
 * 第二次:f(2)=100+50+50+25=f(1)+high(1)+high(2)
 * 第三次:f(3)=100+50+50+25+25+12.5=f(2)+high(2)+high(3)
 * ......
 * 第n次:f(n)=f(n-1)+high(n-1)+high(n);
 */
public class Arithmetic09 {
 public static void main(String[] args) {
  int count=10;
  System.out.println("它在第"+count+"次落地弹起到最高点时,共经过"+f(count)+"米," +
    "第"+count+"次反弹"+high(count)+"高");
 }
 public static double high(int count){
  return 100/Math.pow(2, count);
 }
 public static double f(int n){
  if(n==1){
   return 100+high(n);
  }else{
   return f(n-1)+high(n-1)+high(n);
  }
 }
}

题目十:

/**
 * 一球从100米高度*落下,每次落地后反跳回原高度的一半;
 * 再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
 */
public class Arithmetic10 {
 public static void main(String[] args) {
  double sum=0;
  double high=100;
  for(int i=1;i<=10;i++){
   sum += high;
   high /= 2;
  }
  System.out.println(sum);
  System.out.println(high);
 }
}

题目十一:

/**
 * 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
 * 分析:
 * 先构造出所有的排序,再去掉重复的
 */
public class Arithmetic11 {
 public static void main(String[] args) {
  int i = 0;
  int j = 0;
  int k = 0;
  int amount = 0;
  for (i = 1; i <= 4; i++)//百位上的数字
   for (j = 1; j <= 4; j++)//十位上的数字
    for (k = 1; k <= 4; k++)//个位上的数字
     if (i != j && j != k && i != k) {
      amount += 1;
      System.out.println(i * 100 + j * 10 + k);
     }
  System.out.println("总个数为:"+amount);
 }
}

题目十二:

/**
 * 题目:一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少?
 * 分析:
 * 要懂得什么是完全平方数概念:例如整数a,b,其中a=b*b,则a是完全平方数
 */
public class Arithmetic12 {
 public static void main (String[]args){
  for(int i=0;;i++){
   if((Math.floor(Math.sqrt(i+100)) == Math.sqrt(i+100))
     && (Math.floor(Math.sqrt(i+168)) == Math.sqrt(i+168))){
    System.out.println(i);
   }
  }
  
 }
}

题目十三:

import java.util.Scanner;

/**

* 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时

* 北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas曾提及这个故事,据说创世

* 纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64

* 个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根

* 石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬 运完毕之时,此塔将毁损,而也就是世界末日来临之时。

*

* 分析: 如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,

* 当有两个盘子,就将B当作辅助柱。如果盘数超过2个,将第三个以下的盘子遮起来, 就很简单了,每次处理两个盘子,也就是:A->B、A

* ->C、B->C这三个步骤, 而被遮住的部份,其实就是进入程式的递回处理。 事实上,若有n个盘子,则移动完毕所需之次数为2^n -  1,

* 所以当盘数为64时,则64 如果对这数字没什么概念,就假设每秒钟搬一个盘子好了,也要约5850亿年左右。

*/

public class Arithmetic14 {

public static int count = 0;

public static void hanoi(int n, char A, char B, char C) {

if (n == 1) {

// 将这1个盘子从a搬到c

System.out.println("第" + (++count) + "次:金盘【" + n + "】:从【" + A + "】塔-->【" + C + "】塔!");

} else {

hanoi(n - 1, A, C, B);// 先将前n-1个盘子从a通过c搬到b

// 将第n个盘子从a搬到c    System.out.println("第" + (++count) + "次:金盘【" + n + "】:从【" + A + "】塔-->【" + C + "】塔!");

hanoi(n - 1, B, A, C);// 再将这前n-1个盘子从b通过a搬到c

}

}

public static void main(String[] args) {

char A = 'A', B = 'B', C = 'C';

int n = 1;

System.out.print("请输入盘子数:");

Scanner num = new Scanner(System.in);

n = num.nextInt();

hanoi(n, A, B, C);

}

}

题目十四:

import java.util.Scanner;

/**

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

* 分析:

* 本问题的重点在于要把每个月的天数构建成一个数组(重点考虑平闰年2月份的天数)

*/

public class Arithmetic13 {

int[] days = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

public void getResult() {

Scanner scan = new Scanner(System.in);

System.out.println("请输入年:");

int year = scan.nextInt();

System.out.println("请输入月:");

int month = scan.nextInt();

System.out.println("请输入日:");

int day = scan.nextInt();

int whichDay = 0;   if (month > 1) {

for (int i = 0; i < month - 1; i++) {

whichDay = whichDay + days[i];

}

whichDay = whichDay + day;

if (month > 2 && isLeapYear(year)) {

whichDay = whichDay + 1;

}

}

else {

whichDay = day;

}

System.out.println("whichDay = " + whichDay);

}

public boolean isLeapYear(int year) {

boolean isLeap = false;

if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {

return true;

}

return isLeap;

}

public static void main(String[] args) {

(new Arithmetic13()).getResult();

}

}

题目十五:

/**

* 题目:输出9*9口诀。

*/

public class Arithmetic15 {

// 不出现重复的乘积(下三角)

// public static void main(String[] args) {

//  for (int i = 1; i <= 9; i++) {

//   for (int j = 1; j <= i; j++){

//    System.out.print(j + "*" + i + "=" + i * j + "\t");

//   }

//   System.out.println();

//  }

// }

// 上三角

public static void main(String[] args) {

for (int i = 1; i <= 9; i++) {

for (int j = i; j <= 9; j++)     {

System.out.print(i + "*" + j + "=" + i * j + "\t");

}

System.out.println();

}

}

}

题目十六:

/**
 * 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,
 * 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
 * 以后每天早上都吃了前一天剩下的一半零一个。
 * 到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
 *
 * 分析:
 * 采用逆向思维,(下一天+1)*2=当前天
 */
public class Arithmetic16 {
 //day表示第几天
 public static int total(int day){
  if(day == 10){
   return 1;
  }else{
   return (total(day+1)+1)*2;
  }
  }
  public static void main(String[] args){
   System.out.println(total(1));//第一天即表示总共有多少
  }
}

题目十七:

/**

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

*/

public class Arithmetic19 {

public static void main(String[] args) {

float fm = 1f;

float fz = 1f;

float temp;

float sum = 0f;

for (int i = 0; i < 20; i++) {

temp = fm;

fm = fz;

fz = fz + temp;

sum += fz / fm;

}

System.out.println(sum);

}

}

题目十八:

/**
 * 题目:打印出如下图案(菱形)
 *
 *         *
 *        ***
 *       *****
 *      *******
 *       *****
 *        ***
 *         *
 */
public class Arithmetic18 {
 // public static void main(String[] args) {
 // int i = 0;
 // int j = 0;
 // for (i = 1; i <= 4; i++) {
 // for (j = 1; j <= 2 * i - 1; j++){
 // System.out.print("*");
 // }
 // System.out.println();
 // }
 // for (i = 4; i >= 1; i--) {
 // for (j = 1; j <= 2 * i - 3; j++){
 // System.out.print("*");
 // }
 // System.out.println();
 // }
 // }
 //菱形
 public static void main(String[] args) {
  int i = 0;
  int j = 0;
  for (i = 1; i <= 4; i++) {
   for (int k = 1; k <= 4 - i; k++)
    System.out.print(" ");
   for (j = 1; j <= 2 * i - 1; j++)
    System.out.print("*");
   System.out.println();
  }
  for (i = 4; i >= 1; i--) {
   for (int k = 1; k <= 5 - i; k++)
    System.out.print(" ");
   for (j = 1; j <= 2 * i - 3; j++)
    System.out.print("*");
   System.out.println();
  }
 }
}

题目十九:

/**
 * 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。
 * 已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
 *
 */
public class Arithmetic17 {
 public static void main(String[] args) {
  char i, j, k; /* 假设i是a的对手,j是b的对手,k是c的对手 */
  for (i = 'x'; i <= 'z'; i++) {
   for (j = 'x'; j <= 'z'; j++) {
    if (i != j) {// 这样可以减少循环次数,提高效率
     for (k = 'x'; k <= 'z'; k++) {
      if (i != k && j != k) {
       if (i != 'x' && k != 'x' && k != 'z') {// a说他不和x比,c说他不和x,z比
        System.out.println(" a   Vs   " + i + "\n b   Vs   " + j + "\n c   Vs   " + k);
       }
      }
     }
    }
   }
  }
 }
}

题目二十:

/**
 * 题目:求1+2!+3!+...+20!的和
 */
public class Arithmetic20 {
 public static void main(String[] args) {
  long sum = 0;
  long fac = 1;
  for (int i = 1; i <= 20; i++) {
   fac *= i;
   sum += fac;
  }
  System.out.println("1+2!+3!+...+20!的和是:"+sum);
 }
}

题目二十一:

/**
 * 题目:利用递归方法求5!。
 */
public class Arithmetic21 {
 public static void main(String[] args) {
  System.out.println("利用递归方法求5!,结果是:"+factorial(5));
 }
 public static long factorial(int n){
  if(n==0 || n==1){
   return 1;
  }else{
   return factorial(n-1)*n;
  }
 }
}

题目二十二:

/**
 * 题目:求一个3*3矩阵对角线元素之和
 */
public class Arithmetic22 {
 public static void main(String[] args) {
  int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
  long sum = 0;
  for(int i=0;i<3;i++){
   for(int j=0;j<3;j++){
    if(i == j){
     sum += arr[i][i];
    }
   }
  }
  System.out.println(sum);
 }
}

题目二十三:

import java.util.Random;

/**

* 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

*/

public class Arithmetic23 {

public static void main(String[] args) {

int temp = 0;

int myarr[] = new int[12];

Random r = new Random();

for (int i = 1; i <= 10; i++) {

myarr[i] = r.nextInt(1000);

}

for (int k = 1; k <= 10; k++) {

System.out.print(myarr[k] + ",");

}

for (int i = 1; i <= 9; i++) {

for (int k = i + 1; k <= 10; k++) {

if (myarr[i] > myarr[k]) {

temp = myarr[i];

myarr[i] = myarr[k];

myarr[k] = temp;

}

}

}

System.out.println("");

for (int k = 1; k <= 10; k++) {

System.out.print(myarr[k] + ",");

}

myarr[11] = r.nextInt(1000);

for (int k = 1; k <= 10; k++) {

if (myarr[k] > myarr[11]) {

temp = myarr[11];

for (int j = 11; j >= k + 1; j--) {

myarr[j] = myarr[j - 1];

}

myarr[k] = temp;

}

}

System.out.println("");

for (int k = 1; k <= 11; k++) {

System.out.print(myarr[k] + ",");

}

}

}

题目二十四:

/**
 * 打印出杨辉三角形(要求打印出10行如下图)
                1
              1   1
             1  2  1
            1  3  3  1
           1  4  6  4  1
          1  5 10 10  5  1
 *
 */
public class Arithmetic24 {
 public static void main(String args[]) {
  final int MAX = 10;
  int mat[][] = new int[MAX][];
  int i = 0, j, n;
  n = MAX;
  //赋值
  for (i = 0; i < n; i++) {
   mat[i] = new int[i + 1];
   mat[i][0] = 1;
   mat[i][i] = 1;
   for (j = 1; j < i; j++)
    mat[i][j] = mat[i - 1][j - 1] + mat[i - 1][j];
  }
  //输出
  for (i = 0; i < n; i++) {
   for (j = 0; j < n - 1; j++)
    System.out.print(" ");
   for (j = 0; j <= i; j++)
    System.out.print(" " + mat[i][j]);
   System.out.println();
  }
 }
}

题目二十五:

import java.util.Scanner;
/**
 * 题目:有n个人围成一圈,顺序排号。
 * 从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
 */
public class Arithmetic25 {
 public static void main(String[] args) {
  Scanner s = new Scanner(System.in);
  int n = s.nextInt();
  boolean[] arr = new boolean[n];
  for (int i = 0; i < arr.length; i++) {
   arr[i] = true;// 下标为TRUE时说明还在圈里
  }
  int leftCount = n;
  int countNum = 0;
  int index = 0;
  while (leftCount > 1) {
   if (arr[index] == true) {// 当在圈里时
    countNum++; // 报数递加
    if (countNum == 3) {// 报道3时
     countNum = 0;// 从零开始继续报数
     arr[index] = false;// 此人退出圈子
     leftCount--;// 剩余人数减一
    }
   }
   index++;// 每报一次数,下标加一
   if (index == n) {// 是循环数数,当下标大于n时,说明已经数了一圈,
    index = 0;// 将下标设为零重新开始。
   }
  }
  for (int i = 0; i < n; i++) {
   if (arr[i] == true) {
    System.out.println(i);
   }
  }
 }
}

题目二十六:

/**
 * 题目:字符串排序。
 */
import java.util.ArrayList;
import java.util.Collections;
public class Arithmetic26 {
 public static void main(String[] args) {
  ArrayList<String> list = new ArrayList<String>();
  list.add("010101");
  list.add("010003");
  list.add("010201");
  Collections.sort(list);
  for (int i = 0; i < list.size(); i++) {
   System.out.println(list.get(i));
  }
 }
}

题目二十七:

/**

* 题目:海滩上有一堆桃子,五只猴子来分。

* 第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。

* 第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,

* 第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

*/

public class Arithmetic27 {

static int ts = 0;// 桃子总数

int fs = 1;// 记录分的次数

static int hs = 5;// 猴子数...

int tsscope = 5000;// 桃子数的取值范围.太大容易溢出.

public int fT(int t) {

if (t == tsscope) {    // 当桃子数到了最大的取值范围时取消递归

System.out.println("结束");

return 0;

} else {

if ((t - 1) % hs == 0 && fs <= hs) {

if (fs == hs) {

System.out.println("桃子数 = " + ts + " 时满足分桃条件");

}

fs += 1;

return fT((t - 1) / 5 * 4);// 返回猴子拿走一份后的剩下的总数

} else {     // 没满足条件

fs = 1;// 分的次数重置为1

return fT(ts += 1);// 桃子数加+1

}

}

}  public static void main(String[] args) {

new Arithmetic27().fT(0);

}

}