代码改变世界

编程练习题(java)

2012-07-07 17:34  GhostHorse  阅读(395)  评论(0)    收藏  举报

这是刚学编程语言练习经典题目

【程序1】
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一

对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....

public class FibonacciSequence {
    public static void main(String[] args) {
        //fibonacciWithNoRecursion();

        for(int i=1; i<=12; i++){
            int result = fibonacciRecursion(i) * 2;
            System.out.println("第"+ i +"个月"+ result );
        }

        /*
        for(int i=1; i<=12; i++){
            int result = warpprFibonacciRecursion(i) * 2;
            System.out.println("第"+ i +"个月"+ result );
        }
        */
    }
    //1.
    private static void fibonacciWithNoRecursion()
    {
        int first=1, second=1;
        int sum=0;
        System.out.println("第"+ first +"个月"+ 2 );
        System.out.println("第"+ second +"个月"+ 2 );
        for(int i=3; i<=12; i++){
            sum = first + second;
            first = second;
            second = sum;
            
            System.out.println("第"+ i +"个月"+ sum * 2 );
        }
    }
    //2.
    private static int fibonacciRecursion(int nCount)
    {
        if(nCount == 0){
            return 0;
        }else if(nCount == 1 || nCount == 2){
            return 1;
        }else{
            return fibonacciRecursion(nCount-1) + fibonacciRecursion(nCount-2); 
        }
    }
    //3.
    private static int warpprFibonacciRecursion(int nCount){
        return fibonacciRecursion(nCount, 1, 1);
    }
    private static int fibonacciRecursion(int nCount,int first, int second){
        if(nCount == 1 || nCount == 2 )
            return second;
        else
            return fibonacciRecursion(nCount-1, second, first+second);
    }
    
}

 

 

【程序2】
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。

public class Prime{
    public static void main(String[] agrs){
        
    for(int i = 101; i <= 200; i++ ){
        double $length = Math.sqrt(i);
        boolean flag = true;
            for(int j=2; j<= $length; j++){
                if(i%j == 0)
                    flag = false;
            }
            
            if(flag == true){
                System.out.println(i);
            }
        }
        
    }
}

 

 

【程序3】
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:

153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

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

public class Xianhua {
    public static void main(String args[]){
    Xianhua x=new Xianhua();
    x.f();
}
 public void f(){
     int a,b,c,d;
     for ( int i=100;i<=999 ;i++ )
     {  
             a=i/100;
        b=(i/10)%10;
            c=i%10;
            d=a*a*a + b*b*b + c*c*c;
            
            if(i==d)
                 System.out.println(i);
     }
 }
}
public class TestFuck{
    public static void main(String args[]){
        
        for(int i=100;i<1000;i++){
            String s =   String.valueOf( i);
            int[]  j=new  int[3];
            for(int k=0;k<3;k++)
            j[k]= s.charAt(k)- '0';   
                
            if( i== ( j[0]*j[0]*j[0] + j[1]*j[1]*j[1] + j[2]*j[2]*j[2]))        
            System.out.print(i+"  ");
        }
        
   }
 }

 

public class test{
    public static void main(String args[]){
        
        for(int i=100;i<1000;i++){
            String s =   String.valueOf( i);
            int[]  j = new  int[3];
            for(int k=0;k<3;k++)
                j[k]= s.charAt(k)- '0';   
                
            if( i== (Math.pow(j[0], 3) + Math.pow(j[1],3) + Math.pow(j[2],3)))       
                System.out.print(i+"  ");
        }
        
   }
 }

 

 

 【程序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的值,重复执行第一步。

import java.util.*;

public class Decomposition {
    public static void main(String[] args) {
        ArrayList<Integer> $array=new ArrayList<Integer>();
      Scanner sc=new Scanner(System.in);
      System.out.println("请输入一个正整数:");
      int n = sc.nextInt();
      
      $array=DecompositionOfPrimeFactors(n, $array);
      
      System.out.print(n+"=");
      for(int i=0;i<$array.size();i++){
             if(i!=$array.size()-1)
                    System.out.print($array.get(i)+"*");
             else
                    System.out.print($array.get(i));
      }
     }

    public static ArrayList<Integer> DecompositionOfPrimeFactors(int $int, ArrayList<Integer> $array){
        if($int <= 3){
            $array.add($int);
        }else{
        for(int i=2; i<=$int; i++){
                if($int % i == 0){
                    $array.add(i);
                    $int /= i;
                    if($int != 1)
                        $array = DecompositionOfPrimeFactors($int, $array);
                    break;
                }            
        }                 
        }
        return $array;
    }
}

 

 

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

的用C表示。
1.程序分析:(a>b)?a:b这是条件运算符的基本例子。

import java.util.*;

public class TernaryOperator{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int score = scanner.nextInt();
        
        char result = (score >= 90) ? 'A':
                                         (score < 60) ? 'C': 'B';
                                         
        System.out.println(result);                                
    }
}

 

 

 【程序6】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。

import java.util.*;

public class GCD_LCM{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        System.out.println("求最小公倍数:" + commonMultiple(n,m));
        System.out.println("求最大公约数" + commonDivisor(n,m));
    }
    //求最大公约数
    public static int commonDivisor(int n,int m){
        //辗转相除是用大的除以小的。如果n<m,第一次相当n与m值交换
        while(n%m != 0){
            int temp = n%m;
            n=m;
            m=temp;
        }
        
        return m;
    }
    
    //求最小公倍数
    public static int commonMultiple(int n,int m){
        return n*m/commonDivisor(n,m);
    }
    
}

 

 

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

 

import java.util.*;

public class test{
    public static void main(String args[]){
        int letters=0;//英文字母
        int blankSpace = 0;//空格
        int $number=0; //数字
        int otherCharacters=0; //其它字符
        
        Scanner sc = new Scanner(System.in);
        String strInput = sc.nextLine();
        
        for(int i=0; i< strInput.length();i++){
            
                char currChar = strInput.charAt(i);
                
                if((currChar>='a' && currChar<='z') || (currChar>='A' && currChar<='Z')){
                        letters++;
                }else if(currChar==' '){
                    blankSpace++;
                }else if(currChar>='0' && currChar<'9'){
                    $number++;
                }else{
                    otherCharacters++;
                }
        }
        
        System.out.println("英文字母:" + letters);
        System.out.println("空格:" + blankSpace);
        System.out.println("数字:" + $number);
        System.out.println("其它字符:" + otherCharacters);
        
   }
 }

 

 

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

几个数相加有键盘控制。

1.程序分析:关键是计算出每一项的值。

import java.util.*;

public class test{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        System.out.println("求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加)");
    
        System.out.println("请输入a:");
        String a = sc.nextLine();
        System.out.println("请输入表达式右侧的项数:");
        int $length = sc.nextInt();
        
        int sum = 0;
        for(int i=1; i <= $length; i++){
            sum += getIntByIndex(i, a);
        }
        
        System.out.println("s=" + sum);
   }
   
   private static int getIntByIndex(int index, String a){
           StringBuilder sb = new StringBuilder();
           for(int i=0; i< index; i++){
                   sb.append(a);
           }
            
           return Integer.parseInt(sb.toString());
   }
 }

 

 

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

import java.util.*;

public class test{
    public static void main(String args[]){
   int i,j,sum;                 // i为因数,sum为因数之和。
   for(j=2;j<=1000;j++){
     sum=0;                                   // 在此处给sum赋值,刚开始我在上面就赋值,出现程序运行无结果
     for(i=1;i<j;i++){ 
       if(j%i==0)       
          sum=sum+i;              // 将因数相加
     }
       
     if(sum==j){                     
          System.out.print(j+"是完数,因数是:"); 
          for(i=1;i<j;i++){
           if(j%i==0)
            System.out.print(i+" ");
          }
               System.out.println();
         }
       }           
  }

 }

 

 

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

import java.util.*;

public class test{
    public static void main(String args[]){
        double height=100.0;
        for(int i=0; i<10; i++ ){
            height/=2;
        }
        System.out.println(height);
    }
import java.util.*;

public class test{
    public static void main(String args[]){
        double $height = getHightByCount(10, 100.0);
        System.out.println($height);
    }
    
    private static double getHightByCount(int nCount, double height){
        if(nCount == 0)
            return height;
        else
            return getHightByCount(nCount-1, height/2);
    }
 }