课后作业01:
设计思想:1.使用组合数公式计算,先输入两个整数n和k,求出n的阶乘,k的阶乘,n-k的阶乘,然后利用公式求出结果。
程序流程图:
源程序代码:package zuheshu;
import java.util.Scanner;
public class zuheshu
{
public int jiecheng(int n)
{
Scanner s=new Scanner(System.in);
n=s.nextInt();
int sum=1;
for(int i=1;i<=n;i++)
{
sum=sum*i;
}
return sum;
}
public int Zuhe(int k,int n)
{
int result;
int N;
int K;
int C=n-k;
N=jiecheng(n);
K=jiecheng(k);
C=jiecheng(C);
result=N/(K*C);
return result;
}
public void main(String[] args)
{
int k,n;
Scanner input=new Scanner(System.in);
System.out.println("请输入k,n的值:");
k=input.nextInt();
n=input.nextInt();
Zuhe(k,n);
}
}
结果截图:
2.设计思想:利用杨辉三角形的规律,第i行第j个数值为该位置的数的上一行左右两个数之和,求出组合数等于第k+1行,第n+1列的数字。
源程序代码:import java.util.Scanner;
public class zuheshu {
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
System.out.print("输入n的值:");
int n=sc.nextInt();
System.out.print("输入k的值:");
int k=sc.nextInt();
int[][]a=new int[n+1][n+1];
for(int i=0;i<n+1;i++)
{
for(int j=0;j<=i;j++)
{
if(j==0||j==i)
{
a[i][j]=1;
System.out.print(a[i][j]+"");
}
else
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
System.out.print(a[i][j]);
System.out.print("");
}
}
System.out.println();
}
if(n<2||k==1)
{
System.out.println("num=1");
}
else
{
System.out.println("num="+a[n][k-1]+"="+a[n-1][k-2]+"+"+a[n-1][k-1]);
}
}
}
程序流程图:
结果截图:
3.设计思想:组合数中,若n=1,则输出结果1,如果不为1,利用递归和公式计算第n-1直至1,最后输出结果。
源程序代码:import java.util.Scanner;
public class Digui {
public static int zuhe(int n,int k)
{
if(n<0||k<0||n<k)
{
return 0;
}
if(n==k)
{
return 1;
}
if(k==1)
{
return n;
}
return zuhe(n-1,k)+zuhe(n-1,k-1);
}
public static void main(String atgs[])
{
Scanner sc=new Scanner(System.in);
System.out.print("输入n的值:");
int n=sc.nextInt();
System.out.print("输入k的值:");
int k=sc.nextInt();
System.out.print("result:"+zuhe(n,k));
}
}
结果截图:
课后作业02:
设计思想:该程序需要用递归的算法实现。当A上只有一个盘子时,直接将盘子从A移动到C上,当A上有n个盘子时,需要移动的次数等于2的n次方减去1需要先将前n-1个盘子借助C移动到B上,然后将A上的第n个盘子移动到C上,最后将B上的n-1个借助A移动到C上。从第n个到第一个依次递归。
程序流程图:
Y
N
源程序代码:import java.util.Scanner;
public class Hanoi {
public void hanoi(int n,char A,char B,char C) {
if (n == 1){
move(A,C); //如果n为1,直接从A移动到C
} else {
hanoi(n - 1,A,C,B); //将前n-1个盘子移动到B上
move(A,C);
hanoi(n - 1,B,A,C); //将B上的n-1个盘子移动到C上
}
}
private void move(char A,char C) {
System.out.println("移动方向:由" + A + "移动到" + C); //盘子的移动
}
public static void main(String[] args) {
System.out.println("请输入盘子数:");
Scanner in=new Scanner(System.in);
int n=in.nextInt();
Hanoi hanoi = new Hanoi();
hanoi.hanoi(n,'A','B','C');
}
}
结果截图:
课后作业03:
设计思想:利用递归解决问题。输入字符串后,首先判断字符串的长度,如果是0或1,则肯定是回文字符串,否则,判断字符串的第一个字符和最后一个字符是否相同,相同则将第一个和最后一个字符删去,再次判断直至字符串为空,都相同则为回文字符串,否则不是。
程序流程图:
Y
N
Y
源程序代码:import java.util.Arrays;
import java.util.Scanner;
public class RecursionTest {
public boolean palindromeJudge(String str){
if(str.length()==1||str.length()==0){
return true;
}else if(str.charAt(0)==str.charAt(str.length()-1)){
String strShort=stringCut(str);
return palindromeJudge(strShort);
}else{
return false;
}
}
public static String stringCut(String str){
if(str==null||"".equals(str)){
return "";
}
char[] src=str.toCharArray();
char[] dst=Arrays.copyOfRange(src, 1,src.length-1);
return String.valueOf(dst);
}
public static void main(String[] args) {
RecursionTest test=new RecursionTest();
System.out.println("请输入一个字符串:");
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
System.out.println(test.palindromeJudge(str));
}
}
程序截图: