Java经典问题算法(一)

/*

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

1.

程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....

*/

package cn.com.flywater.FiftyAlgorthm;

public class FirstRabbit {

public static final int MONTH = 15;

public static void main(String[] args) {

   long f1 = 1L, f2 = 1L;

   long f;

   for(int i=3; i

    f = f2;

    f2 = f1 + f2;

    f1 = f;

    System.out.print("

第"

+ i +"个月的兔子对数:");

    System.out.println(" " +f2);

   }

}

}

/*【程序2】

*

作者 南枫题目:判断101-200之间有多少个素数,并输出所有素数。

1.

程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。*/

package cn.com.flywater.FiftyAlgorthm;

public class SecondPrimeNumber {

public static int count = 0;

 public static void main(String[] args) {

     for(int i=101;i<200;i++){

         boolean b = true;//

默认此数就素数

         for(intj=2;j<=Math.sqrt(i);j++){

             if(i%j==0){

                 b = false; //

此数不是素数

                 break;

             }

         }

         if(b){

             count++;

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

         }

     }

     System.out.println("\n

素数的个数:"+count);

    }

}

/*

【程序3】作者 南枫题目:打印出所有的"水仙花数(narcissus

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

1.

程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。*/

package cn.com.flywater.FiftyAlgorthm;

public class ThirdNarcissusNum {

static int b, bb, bbb;

public static void main(String[] args) {

   for(int num=101; num<1000; num++) {

    ThirdNarcissusNum tnn = newThirdNarcissusNum();

    tnn.f(num);

   }

}

public void f(int m) {

   bbb = m / 100;

   bb = (m % 100) / 10;

   b = (m % 100) % 10;

   if((bbb * bbb * bbb + bb * bb * bb + b* b * b) == m) {

    System.out.println(m);

   }

}

}

/*

【程序4】作者 南枫题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

(1)

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

(2)

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

(3)

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

package cn.com.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class FourthPrimeFactor {

static int n, k = 2;

public static void main(String[] args) {

   Scanner s = new Scanner(System.in);

   n = s.nextInt();

   System.out.print(n + "=" );

   FourthPrimeFactor fpf = newFourthPrimeFactor();

   fpf.f(n);

}

public void f(int n) {

   while(k <= n) {

    if(k == n) {

     System.out.println(n);

     break;

    } else if(n > k && n % k== 0) {

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

     n = n / k;

     f(n);

     break;

    } else if(n > k && n % k!= 0) {

     k++;

     f(n);

     break;

    }

   }

}

}

/*

【程序5】作者 南枫题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

1.

程序分析:(a>b)?a:b这是条件运算符的基本例子。*/

package cn.com.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class FifthCondition {

//public static final int S1 = 90;

//public static final int S2 = 60;

static int grade;

public static void main(String[] args) {

   Scanner str = new Scanner(System.in);

   int s = str.nextInt();

   FifthCondition fc = newFifthCondition();

   grade = fc.compare(s);

   if(grade == 1) {

    System.out.print('A');

   } else if(grade == 2) {

    System.out.print('B');

   } else {

    System.out.println('C');

   }

}

public int compare(int s) {

   return s > 90 ? 1

     : s > 60 ? 2

     :3;

}

}

/*

【程序6】作者 南枫题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

1.

程序分析:利用辗除法。*/

/*

*

在循环中,只要除数不等于0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为0,返回

*

较大的数,此数即为最小公约数,最小公倍数为两数之积除以最小公倍数。

* */

package cn.com.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class SixthCommonDiviser {

public static void main(String[] args) {

   int a, b;

   Scanner s1 = new Scanner(System.in);

   Scanner s2 = new Scanner(System.in);

   a = s1.nextInt();

   b = s2.nextInt();

   SixthCommonDiviser scd = newSixthCommonDiviser();

   int m = scd.division(a, b);

   int n = a * b / m;

   System.out.println("

最大公约数:" + m);

   System.out.println("

最小公倍数:" + n);

}

publicint division(int x, int y) {

   int t;

   if(x < y) {

    t = x;

    x = y;

    y = t;

   }

   while(y != 0) {

    if(x == y) return 1;

    else {

     int k = x % y;

     x = y;

     y = k;

    }

   }

   return x;

}

}

/*【程序7】作者 南枫题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

1.

程序分析:利用while语句,条件为输入的字符不为'\n '. */

packagecn.com.flywater.FiftyAlgorthm;

import java.util.*;

public class SeventhCharacterStatistics {

static int digital = 0;

static int character = 0;

static int other = 0;

static int blank = 0;

public static void main(String[] args) {

   char[] ch = null;

   Scanner sc = new Scanner(System.in);

   String s = sc.nextLine();

   ch = s.toCharArray();

   for(int i=0; i

    if(ch[i] >= '0' && ch[i]<= '9') {

     digital ++;

    } else if((ch[i] >= 'a' &&ch[i] <= 'z') || ch[i] > 'A' && ch[i] <= 'Z') {

     character ++;

    } else if(ch[i] == ' ') {

     blank ++;

    } else {

     other ++;

    }

   }

   System.out.println("数字个数:" + digital);

   System.out.println("

英文字母个数:" + character);

   System.out.println("

空格个数:" + blank);

   System.out.println("

其他字符个数:"+ other );

}

}

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

*/

/*

*

算法: 定义一个变量b,赋初值为0;定义一变量sum,赋初值为0,

*

进入循环后,将a + b 的值赋给b,将sum

+ b 的值赋给sum;

*

同时,将a 增加十倍,++ i; 继续循环;

*

循环结束后,输出sum 的值。

*/

package cn.com.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class EightPlus {

static long a = 2, b = 0;

public static void main(String[] args) {

   Scanner s = new Scanner(System.in);

   int n = s.nextInt();

   int i = 0;

   long sum = 0;

   while(i < n) {

    b = b + a;

    sum = sum + b;

    a = a * 10;

    ++ i;

   }

   System.out.println("input number:" + n);

   System.out.println(sum);

}

}

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

*/

package cn.com.flywater.FiftyAlgorthm;

public class NinthWanshu {

publicstatic void main(String[] args) {

   System.out.println("1

到1000的完数有:");

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

    int t = 0;

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

     if(i % j == 0) {

      t = t + j;

     }

    }

    if(t == i) {

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

    }

   }

}

}

/*【程序10】作者 南枫题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?

*/

package cn.com.flywater.FiftyAlgorthm;

public class TenthTreeFall {

static double height = 100;

static double distance = 100;

public static void main(String[] args) {

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

    distance = distance + height;

    height = height / 2;

   }

   System.out.println("

路程:"+ distance);

   System.out.println("

高度:"+ height / 2);

}

}

/*

【程序11】

*

作者 南枫题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

1.

程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。

*/

/*

算法:3个for循环加一个if语句;

*

*/

package cn.com.flywater.FiftyAlgorthm;

public class EleventhNumberRange {

public static void main(String[] args) {

   int count = 0;

   for(int x=1; x<5; x++) {

    for(int y=1; y<5; y++) {

     for(int z=1; z<5; z++) {

      if(x != y && y != z&& x != z) {

       count ++;

       System.out.print(x*100 + y*10 + z+ "   ");

       if(count % 4 == 0) {

        System.out.println();

       }

      }

     }

    }

   }

   System.out.println("

共有"

+ count + "个三位数");

}

}

/*【程序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,求应发放奖金总数?

1.

程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

*/

/*

注意: 要精确到小数点后多少位,用DecimalFormat df = new DecimalFormat("#0.0000");

*

*/

package cn.com.flywater.FiftyAlgorthm;

import java.text.DecimalFormat;

import java.util.*;

public class TwelfthProfitAward {

static double profit = 0;

static double award = 0;

public static void main(String[] args) {

   Scanner s = new Scanner(System.in);

   profit = s.nextInt();

   System.out.println("

输入的利润是"

+ profit + "万");

   if(profit > 0 && profit<= 10) {

    award = profit * 0.1;

   } else if(profit > 10 &&profit <= 20) {

    award = 10 * 0.1 + (profit - 10) *0.075;

   } else if(profit > 20 &&profit <= 40) {

    award = 10 * 0.1 + 10 * 0.075 +(profit - 20) * 0.05;

   } else if(profit > 40 &&profit <= 60) {

    award = 10 * 0.1 + 10 * 0.075 + 20 *0.05 + (profit - 40) * 0.03;

   } else if(profit > 60 &&profit <= 100) {

    award = 20 * 0.175 + 20 * 0.05 + 20 *0.03 + (profit - 60) * 0.015;

   } else if(profit > 100) {

    award = 20 * 0.175 + 40 * 0.08 + 40 *0.015 + (profit - 100) * 0.01;

   }

   DecimalFormat df = newDecimalFormat("#0.00000");

   System.out.println("

应该提取的奖金是" + df.format(award) + "万");

}

}

/*【程序13】

*

作者 南枫题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

1.

程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:

*/

package cn.com.flywater.FiftyAlgorthm;

public class ThirteenthTwiceSqrt {

public static void main(String[] args) {

   for(long l=1L; l<100000; l++) {

    if(Math.sqrt((long)(l+100)) % 1 == 0){

     if(Math.sqrt((long)(l+268)) % 1 ==0) {

      System.out.println(l + "

加100是一个完全平方数,再加168又是一个完全平方数");

     }

    }

   }

}

}

*【程序14】

*

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

1.

程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。

*/

package cn.com.flywater.FiftyAlgorthm;

import java.util.Scanner;

import java.io.*;

public class FourteenthYearMonthDay {

public static void main(String[] args) {

   int year, month, day;

   int days = 0;

   int d = 0;

   FourteenthYearMonthDay fymd = newFourteenthYearMonthDay();

   System.out.print("Input theyear:");

   year =fymd.input();

   System.out.print("Input themonth:");

   month = fymd.input();

   System.out.print("Input TheDay:");

   day = fymd.input();

   if (year < 0 || month < 0 ||month > 12 || day < 0 || day > 31) {

    System.out.println("Input error,please run this program again!");

    System.exit(0);

   }

   for (int i=1; i

    switch (i) {

    case 1:

    case 3:

    case 5:

    case 7:

    case 8:

    case 10:

    case 12:

     days = 31;

     //d += days;

     break;

    case 4:

    case 6:

    case 9:

    case 11:

     days = 30;

     //d += days;

     break;

    case 2:

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

      days = 29;

     } else {

      days = 28;

     }

     //d += days;

     break;

    }

    d += days;

   }

   System.out.println(year +":" + month + ":" + day + "

是今年的第"

+ (d+day) + "天。");

}

public int input() {

   int value = 0;

   Scanner s = new Scanner(System.in);

   value = s.nextInt();

   return value;

}

}

/*【程序15】

*

作者  南枫题目:输入三个整数x,y,z,请把这三个数由小到大输出。

1.

程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>

y则将x与y的值进行交换,然后再用x与z进行比较,如果x>

z则将x与z的值进行交换,这样能使x最小。

*/

package cn.com.flywater.FiftyAlgorthm;

import java.util.*;

public class FifteenthNumberCompare {

public static void main(String[] args) {

   FifteenthNumberCompare fnc = newFifteenthNumberCompare();

   int a, b, c;

   System.out.println("Input 3numbers:");

   a = fnc.input();

   b = fnc.input();

   c = fnc.input();

//

//   fnc.compare(a, b);//

方法调用不能通过改变形参的值来改变实参的值

//   fnc.compare(b, c);//

这种做法是错的

//   fnc.compare(a, c);

   //System.out.println("result:"+ a +" " + b + " " + c);//

没有改变

   if(a > b) {

    int t = a;

    a = b;

    b = t;

   }

   if(a > c) {

    int t = a;

    a = c;

    c = t;

   }

   if(b > c) {

    int t = b;

    b = c;

    c = t;

   }

   System.out.println( a + " "+ b + " " + c);

}

public int input() {

   int value = 0;

   Scanner s = new Scanner(System.in);

   value = s.nextInt();

   return value;

}

public void compare(int x, int y) {//

此方法没用

   if(x > y) {

    int t = x;

    x = y;

    y = t;

   }

}

}

/*【程序16】

*

作者 南枫

*

题目:输出9*9口诀。

*1.

程序分析:分行与列考虑,共9行9列,i控制行,j控制列。

**/

package cn.com.flywater.FiftyAlgorthm;

public class SixteenthMultiplicationTable {

public static void main(String[] args) {

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

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

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

    }

    System.out.println();

   }

}

}

//

【程序17】

//

作者 南枫

//

题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,

//

又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。

//

以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,

//

见只剩下一个桃子了。求第一天共摘了多少。

//1.

程序分析:采取逆向思维的方法,从后往前推断。

packagecn.com.flywater.FiftyAlgorthm;

public class SeventeenthMonkeyPeach {

public static void main(String[] args) {

   int lastdayNum = 1;

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

    lastdayNum = (lastdayNum+1) * 2;

   }

   System.out.println("

猴子第一天摘了" + lastdayNum + " 个桃子");

}

}

/*

【程序18】

*

作者 南枫题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

*/

/*

*

这个程序写得很不好,是知道结果后拼凑起来的,还不如直接写输出语句加上结果来的好。

*/

package cn.com.flywater.FiftyAlgorthm;

public class EighteenthPingpong {

static char[] m = { 'a', 'b', 'c' };

static char[] n = { 'x', 'y', 'z' };

public static void main(String[] args) {

   for (int i = 0; i < m.length; i++){

    for (int j = 0; j < n.length; j++){

     if (m[i] == 'a' && n[j] =='x') {

      continue;

     } else if (m[i] == 'a' &&n[j] == 'y') {

      continue;

     } else if ((m[i] == 'c' &&n[j] == 'x')

       || (m[i] == 'c' && n[j] =='z')) {

      continue;

     } else if ((m[i] == 'b' &&n[j] == 'z')

       || (m[i] == 'b' && n[j] =='y')) {

      continue;

     } else

      System.out.println(m[i] + " vs" + n[j]);

    }

   }

}

}

题目:打印出如下图案(菱形)

   *

  ***

 *****

*******

 *****

  ***

   *

1.

程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。

*/

/*

上半部分循环变量的控制方法是

* for(int i=0; i<(HEIGHT+1) / 2; i++) {

   for(int j=1; j

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

下半部分循环变量的控制方法是

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

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

*    for(int k=1; k<=WIDTH-2*i-1; k++){

*/

package cn.com.flywater.FiftyAlgorthm;

public class NineteenthPrintRhombic {

static final int HEIGHT = 7;

static final int WIDTH = 8;

public static void main(String[] args) {

   for(int i=0; i<(HEIGHT+1) / 2; i++){

    for(int j=1; j

     System.out.print(" ");

    }

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

     System.out.print('*');

    }

    System.out.println();

   }

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

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

     System.out.print(" ");

    }

    for(int k=1; k<=WIDTH-2*i-1; k++){

     System.out.print('*');

    }

    System.out.println();

   }

}

}

上半部分第二重循环应改为:    for(int j=0; j

上半部分第三重循环应改为:    for(int k=1; k<=WIDTH-2*i; k++)

/*

【程序20】

*

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

1.

程序分析:请抓住分子与分母的变化规律。

*/

packagecn.com.flywater.FiftyAlgorthm;

import java.text.DecimalFormat;

public class TwentiethFractionSum {

public static void main(String[] args) {

   int x = 2, y = 1, t;

   double sum = 0;

   DecimalFormat df = newDecimalFormat("#0.0000");

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

    sum += (double)x / y;

    t = y;

    y = x;

    x = y + t;

    System.out.println("

第" + i + " 次相加,和是" + df.format(sum));

   }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容