HNUCM-OJ 遞歸(java)

漢諾塔

/**
漢諾塔
 */

import java.util.Scanner;
public class Main {
   static int step=0;

  static   void move(int n, char a, char b) {
      System.out.println("move "+(++step)+" from "+a+" to "+b);

    }


public static  void  hanoi(int n,char a,char b ,char c){
    if(n>0){
        hanoi(n-1,a,c,b);
        move(n,a,c);
        hanoi(n-1,b,a,c);
    }
}

    public static void main(String[] args) {

        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();//行
        hanoi(n,'A','B','C');

    }
}





全排列

/**
全排列
 */

import java.util.Scanner;
public class Main {
   public static void perm(int list[], int k,int n) {
        int i,t;
        if(k==n) {
            for(i=0; i<=n; i++) {
                System.out.print(list[i]+" ");

            }
            System.out.println();
        }

        for(i=k; i<=n; i++){
            {t=list[k]; list[k]=list[i]; list[i]=t;}
            perm(list,k+1,n);
            {t=list[i]; list[i]=list[k]; list[k]=t;}
        }
    }


    public static void main(String[] args) {

        Scanner cin = new Scanner(System.in);
        int n=cin.nextInt();
       int arr[]=new int[n];
       for(int i=0;i<arr.length;i++){
           arr[i]=cin.nextInt();
       }
        perm(arr,0,arr.length-1);

    }
}

九數組分數

題目描述

1, 2, 3…9 這九個數字組成一個分數,其值恰好爲1/3,要求每個數字出現且只能出現一次,如何組合?編寫程序輸出所有的組合。

輸入

輸出

輸出所有的結果,如果有多個,每條結果佔一行。
結果的格式 : xxxx/xxxxx ,按照分子從小到大的順序輸出。

import java.util.Scanner;
 
public class Main {
    public static void test(int[] Array) {//首先判定份爲1的佔四位數,份爲5的佔五位數
        int a = Array[0]*1000+Array[1]*100+Array[2]*10+Array[3];//份爲1的佔四位數
        int b = Array[4]*10000+Array[5]*1000+Array[6]*100+Array[7]*10+Array[8];//份爲5的佔五位數
        if(a*3==b) {  //滿足條件
            System.out.println(a+"/"+b);
        }
    }
 
    public static void perm(int[] a,int k,int n){
        int i;
        int t;
        if(k==n){
            test(a);
        }
        for(i=n;i>=k;i--){
            {t=a[k];a[k]=a[i];a[i]=t;}
            perm(a,k+1,n);
            {t=a[i];
            a[i]=a[k];
            a[k]=t;
            }
             
        }
    }
 
    public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
       
           int Array[]= {1,2,3,4,5,6,7,8,9};
           int len=Array.length;
           perm(Array,0,len-1);
           System.out.println(" ");
            
        
        
    }
}

超級青蛙

題目描述

一隻超級青蛙一次可以跳上1級臺階,也可以跳上2級……它也能夠跳上n級臺階。請問,該青蛙跳上一個n級的臺階總共有多少種跳法?

輸入

輸入一個正整數n表示臺階的數量。

輸出

輸出總的跳法數。

樣例輸入 Copy

1
2

樣例輸出 Copy

1
2

import java.util.Scanner;
 
public class Main {
    public static int digui(int n) {
        if(n==1) {
            return 1;
        }else {
            return digui(n-1)*2; 
            //  F(n)=F(n-1)+F(n-2)+…F(1)+1
            //F(n-1)= F(n-2)+…F(1)+1
                //  兩式相減得F(n)=2F(n-1) ;
        }
    }
     
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
            while(sc.hasNext()) {
                int n=sc.nextInt();
                System.out.println(digui(n));
                 
            }
             
            }
         
             
             
        }

斐波那契數

題目描述

Kimi號稱自己已經記住了1-100000之間所有的斐波那契數。
爲了考驗他,我們隨便出一個數n,讓他說出第n個斐波那契數。
當然,斐波那契數會很大。
因此,如果第n個斐波那契數不到6位,則說出該數;否則只說出最後6位。

輸入

輸入有多組數據。
每組數據一行,包含一個整數n (1≤n≤100000)。

輸出

對應每一組輸入,輸出第n個斐波那契數的最後6位。

樣例輸入 Copy

1
2
3
4
100000

樣例輸出 Copy

1
2
3
5
537501

import java.util.*;
public class Main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner cin = new Scanner(System.in);
        int []result = new int[100001];
        result[0]=1;
        result[1]=1;
        for(int i=2;i<100001;i++){
            result[i] = (result[i-1]+result[i-2])%1000000;
        }
        while(cin.hasNext()){
            int n = cin.nextInt();
            System.out.printf(n<25?"%d\n":"%06d\n",result[n]);
        }
         
    }
}

蜂房

題目描述

有一只經過訓練的蜜蜂只能爬向右側相鄰的蜂房,不能反向爬行。請編程計算蜜蜂從蜂房a爬到蜂房b的可能路線數。
其中,蜂房的結構如下所示。

在這裏插入圖片描述

輸入

多組數據輸入,每組數據包含兩個正整數a, b,且 a<b。

輸出

蜜蜂從蜂房a爬到蜂房b的可能路線數。

樣例輸入 Copy

1 2
3 4

樣例輸出 Copy

1
1

import java.util.ArrayList;
import java.util.Scanner;
  
 
public class Main {
    public static int s(int n) {
        if(n==0||n==1) {
            return 1;
        }
            return s(n-1)+s(n-2);
         
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
         
        while (scanner.hasNext()) {
            int a = scanner.nextInt();
            int b = scanner.nextInt();
            if(a>b) {
                int t;
                t=a;
                a=b;
                b=t;
            }
            int num = b - a;
            System.out.println(Main.s(num));
             
        }
 
    }    
  
}

數字求和

題目描述

使用遞歸編寫一個程序,計算一個正整數中所有數字之和。例如輸入234,輸出9

輸入

多組輸入,每組輸入一個正整數。

輸出

輸出結果,每個結果佔一行。

樣例輸入 Copy

234

樣例輸出 Copy

9

import java.util.*;
import java.util.Scanner;
  
 
public class Main {
     
   public static int sum(int n) {
       if(n==0) {
           return 0;}
       return sum(n/10)+n%10;
        
        
   }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
         
        while (scanner.hasNext()) {
            int n;
            n=scanner.nextInt();
            System.out.println(Main.sum(n));
 
    }  
         
         
         
         
         
    }
}
 

XP的樓梯

題目描述

XP是個淘氣的孩子,他最近迷上了跳樓梯。他可以一次跳一級,也可以一次跳兩級,他居然還能夠一次跳三級樓梯(危險動作,請勿模仿)。某次,XP在跳完樓梯後突然想到一個問題,如果有n級樓梯,他從第一級開始往上跳,一直跳到第n級共有多少種不同的方案?你能幫他解決這個問題嗎?當然,如果只有一級樓梯,很明顯他只有一種選擇。

輸入

單組輸入數據 n (0<n<30)

輸出

輸出一行結果

樣例輸入 Copy

29

樣例輸出 Copy

15902591

import java.util.Scanner;
public class Main {
     public static int s(int n) {
         if(n==1||n==2) {
             return 1;
         }else if(n==3) {
             return 2;
         }else
             return s(n-1)+s(n-2)+s(n-3);
     } 
    public static void main(String[] args) {
        
        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        System.out.println(Main.s(n));
    }    
 
         
         
    }

字符統計

題目描述

輸入一行字符串(字符串長度小於10000,由大小寫字母、阿拉伯數字和空格組成),分別統計出其中大寫英文字母,小寫英文字母、阿拉伯數字和空格的個數。

輸入

一行字符串(字符串長度小於10000,由大小寫字母、阿拉伯數字和空格組成)

輸出

分別輸出大寫英文字母,小寫英文字母、阿拉伯數字和空格的個數,用空格隔開

樣例輸入 Copy

h0u84nfx 7

樣例輸出 Copy

0 5 4 1

import java.util.Scanner;
public class Main {
     static int A = 0;
    static int a1 = 0;
    static int num =0;
    static int countA =0;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);//掃描器,接受控制檯的輸入
        String scanStr = scan.nextLine();//取出控制檯的一行信息
        
        char[] a = scanStr.toCharArray();//將接收到的字符串變成字符數組
        for(int i = 0;i<a.length;i++){
            if(a[i]>64&&a[i]<91) {
                A+=1;
            }else if(a[i]>=97&&a[i]<=122) {
                a1+=1;
            }else if((int)a[i]>47&&(int)a[i]<=57) {
                num+=1;
            }else {
                countA+=1;
            }
             
        }
        System.out.print(A);
        System.out.print(' ');
        System.out.print(a1);
        System.out.print(' ');
        System.out.print(num);
        System.out.print(' ');
        System.out.print(countA);
         
         
    }    
 
         
         
    }

數的劃分

題目描述

使用遞歸編寫一個程序,求一個正整數n的所有劃分個數。
例如,輸入3,輸出3;輸入4,輸出5。

輸入

多組輸入,每一組是一個正整數n。

輸出

輸出劃分數。

樣例輸入 Copy

3
4

樣例輸出 Copy

3
5

import java.util.Scanner;
 
public class Main {
     
 //將n的最大加數不大於m的劃分個數記作q(n,m)
    public static int q(int n, int m) {
        if (n < 1 || m < 1) 
            return 0;
        if (n == 1 || m == 1) 
            return 1;
        if (n < m)
            return q(n, n);
        if (n == m) 
            return q(n, m - 1) + 1;
        return q(n, m - 1) + q(n - m, m);
    }
 
 
    public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
       
         int n;
         while(cin.hasNext()) {
         n=cin.nextInt();
          int s= q(n,n);
           System.out.println(s);
         }
        
        
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章