一,使用计算机计算组合数

1,设计思想

(1)使用组合数公式利用n!来计算Cn^k=n!/k!(n-k)!用递推计算阶乘

(2)使用递推的方法用杨辉三角计算Cn+1^k=Cn^k-1+Cn^k

通过数组写出杨辉三角,对应的几排几列就对应这组合数的n和k

(3)使用递归的方法用组合数递推公式计算

定义带参数的方法,将不同的参数传递给方法,然后计算出阶乘

2,程序流程图

3,程序源代码

package 计算组合数;

import java.util.Scanner;

public class Caculate {

int n,k;//定义私有成员变量

static Scanner input=new Scanner(System.in);

public void caculate1(){

System.out.println("请输入n和k的值");

System.out.print("n:");

n=input.nextInt();

System.out.print("k:");

k=input.nextInt();

if(k>n)

System.out.println("k不能大于n");

else if(k==n)

System.out.println(1);//规定当n=k时 输出1

else{

int a=1,b=1,c=1;//初始化a b c为1

int d=n-k;

while(k!=0||d!=0){//当k和n-k都等于0时循环结束

if(n!=0){

a=a*n;//递推

n=n-1;

}

if(k!=0){

b=b*k;//递推

k=k-1;

}

if(d!=0){

c=c*d;//递推

d=d-1;

}

}

int result=a/(b*c);

System.out.println("Cn^k="+result);

}

}

public void caculate2(){

int a[][]=new int [100][100];

for(n=0;n<10;n++){

a[n][0]=1;

for(k=0;k<=n;k++){

if(n==k)a[n][k]=1;

if(n>k&&k!=0)

a[n][k]=a[n-1][k-1]+a[n-1][k];

System.out.print(a[n][k]+" ");

}

System.out.print("\n");

}

System.out.println("计算组合数\n请输入n和k的值:");

n=input.nextInt();

k=input.nextInt();

System.out.println("由杨辉三角可得知C(n+1)^k的值为:"+a[n+1][k]);

System.out.println("由杨辉三角可得知Cn^(k-1)的值为:"+a[n][k-1]);

System.out.println("由杨辉三角可得知Cn^k的值为:"+a[n][k]);

System.out.println("所以得出:\nC(n+1)^k=Cn^(k-1)+Cn^k");

}

public int caculate3(int n){

if(n==0)

System.exit(0);

if(n==1)

return 1;

else

return n*caculate3(n-1);              //递归

}

public static void main(String[] args){

int a;

do{

System.out.println("1,使用组合数公式利用n!来计算Cn^k=n!/k!(n-k)!");

System.out.println("2,使用递推的方法用杨辉三角计算Cn+1^k=Cn^k-1+Cn^k");

System.out.println("3,使用递归的方法用组合数递推公式计算");

System.out.println("4,退出");

a=input.nextInt();

Caculate Ca=new Caculate();

switch(a){

case 1:{Ca.caculate1();System.out.println();}break;

case 2:{Ca.caculate2();System.out.println();}break;

case 3:{

int a1=1,b1=1,c1=1,d1=1,e1=1,f1=1;

System.out.println("组合数递推公式为:Cn^k=C(n-1)^(k-1)+C(n-1)^k");

System.out.println("请输入n和k的值:");

System.out.print("n:");

int n1=input.nextInt();

System.out.print("k:");

int k1=input.nextInt();

//组合数递推公式计算

if(n1-1>=k1){

a1=Ca.caculate3(n1);     //计算n!

b1=Ca.caculate3(n1-1);   //计算(n-1)!

c1=Ca.caculate3(k1);     //计算k!

d1=Ca.caculate3(k1-1);   // 计算(k-1)!

e1=Ca.caculate3(n1-k1);   //计算(n-k)!

if(n1-1-k1>0)

f1=Ca.caculate3(n1-1-k1);  //计算(n-k-1)!

if(k1==0)

System.out.println("Cn^k="+1);

else

System.out.println("Cn^k="+a1/(c1*e1));

if(n1-1==k1-1||k1==1)

System.out.println("C(n-1)^(k-1)="+1);

else

System.out.println("C(n-1)^(k-1)="+b1/(d1*e1));

if(n1-1==k1||k1==0)

System.out.println("C(n-1)^k="+1);

else

System.out.println("C(n-1)^k="+b1/(c1*f1));

System.out.println("由上述结果可得知:Cn^k=C(n-1)^(k-1)+C(n-1)^k");

}

else

System.out.println("error! n不能小于k且n-1不能小于k");

System.out.println();

}break;

case 4:{System.exit(0);}break;

default:System.out.println("error");

}

}while(a!=4);

}

}

4,结果截图

二,汉诺塔问题

1,设计思想

定义hanio方法递归调用直到盘子数量等于1

2,程序流程图

3,程序源代码

package 汉诺塔问题;

import java.util.Scanner;

public class Ta {

public void hanoi(int n,char one,char two,char three){

if(n==1){

move(one,three);

}

else{

hanoi(n-1,one,three,two);

move(one,three);

hanoi(n-1,two,one,three);

}

}

public void move(char x,char y){

System.out.println(x+"->"+y);

}

public static void main(String[] args){

//int A[]=new int[64];

int number;

Scanner input=new Scanner(System.in);

System.out.print("请输入移动的盘子数量:");

number=input.nextInt();

System.out.println("假设有三个底座A、B、C,那么移动盘子的过程如下:");

Ta t=new Ta();

t.hanoi(number,'A','B','C');

}

}

4,结果截图

三,使用递归方式判断某个字符串是否回文

1,设计思想

(1)先输入一个字符串传参进入huiWen方法中

(2)将输入的字符串想加传给temp2

(3)将temp2倒序传给temp1

(4)判断:如果字符串temp1和temp2相同,则回文;否则输出不回文的字样并提示用户继续输入

(5)如果不是回文则调用方法自身继续输入字符串

2,程序流程图

3,程序源代码

package 递归判断字符串是否回文;

import java.util.Scanner;

public class Judge {

String temp2=" ",temp1;

Scanner input=new Scanner(System.in);

public void huiWen(String s1){

temp2=s1+temp2;

temp1=reverseString(temp2);   //调用reverse方法使字符串temp2倒序

if(temp2.equals(temp1)){

System.out.println("该字符串回文");

System.out.println("原字符串:"+temp2);

System.out.println("现字符串:"+temp1);

}

else{

if(!temp2.equals(temp1))

System.out.println("以上字符串不回文,请继续输入");

huiWen(input.nextLine());      //调用自身继续输入字符串

}

}

public static String reverseString(String string){   //使字符串倒序的方法

StringBuffer buf=new StringBuffer();

buf.append(string);

return buf.reverse().toString();

}

public static void main(String[] args){

Scanner input=new Scanner(System.in);

Judge j=new Judge();

System.out.println("请输入一个字符串,直到输入空格结束:");

j.huiWen(input.nextLine());

}

}

4,结果截图

java实现组合数_n!_杨辉三角_组合数递推公式_回文数_汉诺塔问题的更多相关文章

  1. Java数组的应用:案例:杨辉三角,三维数组,字符串数组

    //import java.util.Arrays; //包含Arrays //import java.util.Random; public class HelloWorld { public st ...

  2. [noip2016]组合数问题<dp+杨辉三角>

    题目链接:https://vijos.org/p/2006 当时在考场上只想到了暴力的做法,现在自己看了以后还是没思路,最后看大佬说的杨辉三角才懂这题... 我自己总结了一下,我不能反应出杨辉三角的递 ...

  3. Java实现第八届蓝桥杯杨辉三角

    杨辉三角 杨辉三角也叫帕斯卡三角,在很多数量关系中可以看到,十分重要. 第0行: 1 第1行: 1 1 第2行: 1 2 1 第3行: 1 3 3 1 第4行: 1 4 6 4 1 - 两边的元素都是 ...

  4. java例题_33 等腰输出杨辉三角

    1 /*33 [程序 33 杨辉三角] 2 题目:打印出杨辉三角形(要求打印出 10 行如下图) 3 程序分析: 4 1 5 1 1 6 1 2 1 7 1 3 3 1 8 1 4 6 4 1 9 1 ...

  5. POJ 3187 全排列+杨辉三角(组合数)

    思路: next_permutation()加个递推组合数随便搞搞就A了- //By SiriusRen #include <cstdio> #include <algorithm& ...

  6. CodeForces-2015 HIAST Collegiate Programming Contest-Gym-100952A.水题 100952B.水题 100952C.回文字符串 100952D.杨辉三角处理组合数 其他题目待续。。。

    哈哈哈哈哈哈哈,最近一直在补题,改各种错误的代码,wa了20多遍,改到心态爆炸,改好之后,感觉世界都美好了(叉会腰~)... A. Who is the winner? time limit per ...

  7. Java使用for循环输出杨辉三角

    杨辉三角形由数字排列,可以把它看做一个数字表,其基本特性是两侧数值均为1,其他位置的数值是其正上方的数字与左上角数值之和.编写程序,使用for循环输出包括10行在内的杨辉三角形. 思路是创建一个整型二 ...

  8. 杨辉三角的打印(Java)

    // //输入指定的行数,打印杨辉三角 // //每个数等于它上方两数之和. //每行数字左右对称,由1开始逐渐变大. //第n行的数字有n项. // // // //可从打印菱形的思想出发:???? ...

  9. Java_基础篇(杨辉三角)

    对于刚刚学Java的同学来说,杨辉三角是一个很好的例子. 杨辉三角让初学者更好的理解数组的定义和更好地去运用数组,特别是二维数组. 除此之外,还让初学者更好的掌握嵌套语句的使用. 以下是我的杨辉三角J ...

随机推荐

  1. UVA 12633 Super Rooks on Chessboard (生成函数+FFT)

    题面传送门 题目大意:给你一张网格,上面有很多骑士,每个骑士能横着竖着斜着攻击一条直线上的格子,求没被攻击的格子的数量总和 好神奇的卷积 假设骑士不能斜着攻击 那么答案就是没被攻击的 行数*列数 接下 ...

  2. 使用Ansible安装部署nginx+php+mysql之安装php(2)

    二.使用Ansible安装php 1.php.yaml文件内容 - hosts: clong remote_user: root gather_facts: no tasks: # 安装libseli ...

  3. 《黑白团团队》第八次团队作业:Alpha冲刺 第五天

    项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 团队项目Github仓库地址链接. 第五天 日期:2019/6/19 成员 ...

  4. HDU 2371

    知道了怎么置换之后,就可以用矩阵来置换了,但这道题一直关于置换的地方读不明白. #include <iostream> #include <cstdio> #include & ...

  5. rails Installer之后的调整rails.bat等文件

    rails Installer之后的调整rails.bat文件 出现系统找不到指定路径 学习了:http://www.jianshu.com/p/065355a731ee 修改rails.bat为 @ ...

  6. 数据操作的封装--sqlhelper

    为了提高软件的灵活性和可维护性,软件的代码须要科学的管理.我们引入了架构这个词.设计模式提醒我们,软件中反复性的代码须要封装起来. 近期在做收费系统时.须要和数据库进行频繁的联系.既然是反复的使用,就 ...

  7. 一个三年Android开发的总结-开篇

    一个三年Android开发的总结-开篇 转眼间全职从事Android开发已有三年,想把这一阶段的积累总结记录并展现出来,作为Android开发必备的知识,希望对有一定Android开发基础的人进阶有裨 ...

  8. NHibernate之旅(14):探索NHibernate中使用视图

    本节内容 引入 1.持久化类 2.映射文件 3.測试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习怎样在NHibernate中使用 ...

  9. HDU 2874 LCA离线算法 tarjan算法

    给出N个点,M条边.Q次询问 Q次询问每两点之间的最短距离 典型LCA 问题   Marjan算法解 #include "stdio.h" #include "strin ...

  10. bzoj1786: [Ahoi2008]Pair 配对&&1831: [AHOI2008]逆序对

    一个自以为很对的东西,我们往-1放的数肯定是不增的. 然后就预处理一下,假如i这个位置放j会多多少逆序对. DP一下,我的复杂度应该是O(n*m^2)的,然而你随便搞都能省掉一个m吧,我算了算好像可以 ...