Java算法(一)

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

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

具体分析如下:

分析:从第一个兔子开始,第1个月1只兔子,由于“长到第三个月后每个月又生一只兔子”,所以第2个月也是1只兔子,第3个月时可以生一只兔子,所以总数为2只,这时,其中有一只是以后每个月都可以生一只兔子的老兔子,另一只是一只新兔子,它只有在第三个月的时候才可以每个月生一只兔子;这样的话,第4个月的兔子总数为3只,…以此类推。

很容易可以看出小兔子的数量符合菲波那切数列;

解法一:

    int sum;//每月的兔子总数
        int a = 1;//第一个月的兔子数
        int b = 1;//第二个月的兔子数
        for (int i = 3; i <= 12; i++) {
            sum = b + a;
            b = a;
            a = sum;
      System.out.println("第" + i + "个月的兔子总是为:" + sum);
        }

解法二:
//递归方法实现
public class A01 {
public static void main(String args[]) {
for (int i = 1; i <= 20; i++)
System.out.println(F(i));
} public static int F(int month){ if(month == 1 || month == 2){ return 1; }else return F(month-1)+F(month-2); }
【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。


public class A02 {


public static void main(String[] args) {
for(int i=100;i<201;i++) {
boolean flag = true;
for(int j=2;j<i;j++) {
if(i%j==0) {
flag = false;
break;
}
}
if(!flag) {
continue;
}
System.out.println(i+"是素数");
}
}
}

【程序3】 题目:打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,
其各位数字立方和等于该数本身。例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。


public class A03 {


public static void main(String[] args) {
System.out.println("100到1000中秋水仙数为:");
for(int i=100;i<1000;i++) {
int b = i/100;
int s = (i%100)/10;
int g = i%10;
if(i==b*b*b+s*s*s+g*g*g) {

System.out.println(i);
}
}
}

【程序4】 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 
程序分析:对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n > i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数你,重复执行第一步。
(3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步


import java.util.Scanner;
public class A04 {

public void fenjie(int n) {

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

if (n % i == 0) {
System.out.print(i);
if(n!=i){
System.out.print("*");
}
fenjie(n/i);
}
} System.exit(0);

}

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入N的值:");
int N = in.nextInt();
System.out.print( "分解质因数:" + N +"=");
new A04().fenjie(N);
}
}

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


import java.util.Scanner;

public class A05 {

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入成绩:");
int num = in.nextInt();
/*第一种

if(num>=90) {
System.out.println("A");
}
else if(num>=60&&num<=89) {
System.out.println("B");
}
else if(num>=0&&num<=59) {
System.out.println("C");
}
else {
System.out.println("输入错误");
}*/

//第二种
System.out.println( (num>=90)?"A":((num>59)?"B":"C"));
}
}

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

import java.util.Scanner;
public class A06 {
public static void main(String[] args){
int a,b,m,n;
Scanner in=new Scanner(System.in);
System.out.println("请输入一个正整数:");
a=in.nextInt();
System.out.println("再输入一个正整数:");
b=in.nextInt();
A use=new A();
m=use.commonDivisor(a,b);
n=a*b/m;
System.out.println("最大公约数:"+m);
System.out.println("最小公倍数:"+n);
}
}
class A{
public int commonDivisor(int x,int y){
if(x<y){
int t=x;
x=y;
y=t;
}
while(y!=0){
if(x==y)return x;
else{
int k=x%y;
x=y;
y=k;
}
}
return x;
}
}

【程序7】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用for循环语句,if条件语句。

import java.util.Scanner;


public class A07 {
public static void main(String[] args){
System.out.println("请输入一个字符串;");
Scanner in=new Scanner(System.in);
String str=in.nextLine();
char[] ch=str.toCharArray();
count s=new count();
s.count(ch);
}
}
class count{
int SHUZI,ZIMU,KONGGE,QITA;
public void count(char[] arr){
for(int i=0;i<arr.length;i++){
if(arr[i]>='0'&&arr[i]<='9'){
SHUZI++;
}else if((arr[i]>='a'&&arr[i]<='z')||(arr[i]>='A'&&arr[i]<='Z')){
ZIMU++;
}else if(arr[i]==' '){
KONGGE++;
}else{
QITA++;
}
}
System.out.println("数字个数:"+SHUZI);
System.out.println("英文字母个数:"+ZIMU);
System.out.println("空格个数:"+KONGGE);
System.out.println("其他字符个数:"+QITA);
}
}


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

import java.util.Scanner;
public class A08 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入a的值:");
int a = in.nextInt();
System.out.println("请输入n个数:");
int n = in.nextInt();
int s = 0,t=0;
for (int i = 1; i <= n; i++) {
t += a;
a = a*10;
s += t;
}
System.out.println(s);
}
}





posted @ 2018-05-11 23:19  Tom-shushu  阅读(454)  评论(0编辑  收藏  举报