java实现组合数_n!_杨辉三角_组合数递推公式_回文数_汉诺塔问题
一,使用计算机计算组合数
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!_杨辉三角_组合数递推公式_回文数_汉诺塔问题的更多相关文章
- Java数组的应用:案例:杨辉三角,三维数组,字符串数组
//import java.util.Arrays; //包含Arrays //import java.util.Random; public class HelloWorld { public st ...
- [noip2016]组合数问题<dp+杨辉三角>
题目链接:https://vijos.org/p/2006 当时在考场上只想到了暴力的做法,现在自己看了以后还是没思路,最后看大佬说的杨辉三角才懂这题... 我自己总结了一下,我不能反应出杨辉三角的递 ...
- Java实现第八届蓝桥杯杨辉三角
杨辉三角 杨辉三角也叫帕斯卡三角,在很多数量关系中可以看到,十分重要. 第0行: 1 第1行: 1 1 第2行: 1 2 1 第3行: 1 3 3 1 第4行: 1 4 6 4 1 - 两边的元素都是 ...
- 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 ...
- POJ 3187 全排列+杨辉三角(组合数)
思路: next_permutation()加个递推组合数随便搞搞就A了- //By SiriusRen #include <cstdio> #include <algorithm& ...
- CodeForces-2015 HIAST Collegiate Programming Contest-Gym-100952A.水题 100952B.水题 100952C.回文字符串 100952D.杨辉三角处理组合数 其他题目待续。。。
哈哈哈哈哈哈哈,最近一直在补题,改各种错误的代码,wa了20多遍,改到心态爆炸,改好之后,感觉世界都美好了(叉会腰~)... A. Who is the winner? time limit per ...
- Java使用for循环输出杨辉三角
杨辉三角形由数字排列,可以把它看做一个数字表,其基本特性是两侧数值均为1,其他位置的数值是其正上方的数字与左上角数值之和.编写程序,使用for循环输出包括10行在内的杨辉三角形. 思路是创建一个整型二 ...
- 杨辉三角的打印(Java)
// //输入指定的行数,打印杨辉三角 // //每个数等于它上方两数之和. //每行数字左右对称,由1开始逐渐变大. //第n行的数字有n项. // // // //可从打印菱形的思想出发:???? ...
- Java_基础篇(杨辉三角)
对于刚刚学Java的同学来说,杨辉三角是一个很好的例子. 杨辉三角让初学者更好的理解数组的定义和更好地去运用数组,特别是二维数组. 除此之外,还让初学者更好的掌握嵌套语句的使用. 以下是我的杨辉三角J ...
随机推荐
- nyoj48-小明的调查作业
48-小明的调查作业 内存限制:64MB时间限制:1000msSpecial Judge: No accepted:3submit:4 题目描述: 小明的老师布置了一份调查作业,小明想在学校中请一些同 ...
- base64 编码的作用及原理
Base64编码的作用:由于某些系统中只能使用ASCII字符.Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法.它使用下面表中所使用的字符与编码. 而且base64特别适合在 ...
- 实战:一、使用mongo做一个注册的小demo
思路:1.使用mongoose 进行 数据库的链接 2.使用Schema来进行传输字段的定义 3.安装koa-router进行数据处理4.安装koa-bodyparser 进行post数据交互5.解决 ...
- Java Web学习总结(27)——JavaEE中Web服务器、Web容器、Application服务器区别及联系
在JavaEE 开发Web中,我们经常会听到Web服务器(Web Server).Web容器(Web Container).应用服务器(Application Server),等容易混淆不好理解名词. ...
- 洛谷p3803 FFT入门
洛谷p3803 FFT入门 ps:花了我一天的时间弄懂fft的原理,感觉fft的折半很神奇! 大致谈一谈FFT的基本原理: 对于两个多项式的卷积,可以O(n^2)求出来(妥妥的暴力) 显然一个多项式可 ...
- firewall 允许app访问网络
https://www.wikihow.com/Block-a-Program-with-Windows-Firewall 打开windows firewall change settings 然后就 ...
- 使用CNN做电影评论的负面检测——本质上感觉和ngram或者LSTM同,因为CNN里图像检测卷积一般是3x3,而文本分类的话是直接是一维的3、4、5
代码如下: from __future__ import division, print_function, absolute_import import tensorflow as tf impor ...
- Centos7 minimal 系列之rabbitmq的理解(九)
一.前言 传送门:rabbitmq安装 第一次接触消息队列,有很多不熟悉的地方,可能也有很多写的不对的,大家一起学习. RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统. 使用场景: ...
- Fildder 4接口测试工具Post请求方式
- 格式化日期字符串 FormatSettings使用
如果 你想要得到 YYYY-MM/DD 这样的字符串 你肯定说这太简单了 直接 ShowMessage(FormatDateTime('YYYY-MM/DD',now)); 运行结果 YYYY-MM ...