求java逻辑运算例题
有关java计算的例题,如杨辉三角,初高中时的奥术题,急用,希望能有详细解答,谢谢!
----------------解决方案--------------------------------------------------------
杨辉三角:
【来源:互联网】
public class Yanghui {
public static void main(String[] args) {
Yanghui yang = new Yanghui();
yang.printYanghuiTriangle(13);
}
/**
* 生成指定行数的杨辉三角形
*
* @param lines 杨辉三角形的行数
*/
public void printYanghuiTriangle(int lines) {
if(lines < 1) {
throw new IllegalArgumentException("lines must be great than 0.");
}
if(lines > 30) {
throw new IllegalArgumentException("lines is too big.");
}
int[] line = new int[lines];
int maxLen = getMaxLen(lines);
for(int i = 0; i < lines; i++) {
line[0] = line[i] = 1;
for(int j = 1, k = i / 2, pre = line[0]; j <= k; j++) {
int cur = line[j];
line[i - j] = line[j] += pre;
pre = cur;
}
printLine(line, i + 1, maxLen);
}
}
/**
* 根据指定行数的杨辉三角形,计算其中最大数字的长度
* @param lines 杨辉三角形的行数
* @return 最大数字的长度
*/
private int getMaxLen(int lines) {
int k = lines / 2;
long maxNum = factorial(k + 1, lines - 1) / factorial(1, lines - 1 - k);
return getLength(maxNum);
}
/**
* 阶乘计算
* @param start 阶乘计算的起始数字
* @param num 阶乘计算的终止数字
* @return 阶乘计算结果
*/
private long factorial(int start, int num) {
long result = start > 0 ? start : 1L;
while(num > start) {
result *= num--;
}
return result;
}
/**
* 根据指定数字计算数字的长度
* @param num 数字
* @return 数字的长度
*/
private int getLength(long num) {
int len = 0;
while(num > 0L) {
num /= 10L;
len++;
}
return len;
}
private void printLine(int[] yanghui, int line, int width) {
printSpaces((yanghui.length - line) * width);
for(int i = 0; i < line; i++) {
if(i > 0) {
printSpaces(width);
}
printSpaces(width - getLength(yanghui[i]));
System.out.print(yanghui[i]);
}
System.out.println();
if(width > 1) {
System.out.println();
}
}
private void printSpaces(int spaceCount) {
for(int i = 0; i < spaceCount; i++) {
System.out.print(" ");
}
}
}
----------------解决方案--------------------------------------------------------
还有没,急用啊。。。。
----------------解决方案--------------------------------------------------------
汉诺塔::
【在网上给你找的】呵呵
#35;include <iostream>
using namespace std;
//盘子的最大数量
const int MAXNUM = 10;
//准备三个位置
int a[MAXNUM],b[MAXNUM],c[MAXNUM];
//声明三个函数,注意其中的重载
void disp( int [] );//显示一个位置上的盘子
void disp( );//显示所有三个位置上的盘子
void hano( int, int[], int[], int[] ); //移动汉诺塔
//主函数
int main()
{
int num;
cout << "please input the number of towers:";
cin >> num;//输入盘子个数
if( num>MAXNUM )
return 0;
//在第一个位置放上这些盘子
for( int i=1; i<=num; i++ )
a[i] = num+1-i;
//每个位置的0号元素用来保存这个位置的盘子个数
a[0] = num;//开始的时候所有盘子都放在第一个位置
b[0] = 0;//另外两个位置的盘子个数都为0
c[0] = 0;
disp();//显示一下初始状态
hano( num, a, b, c );//移动汉诺塔
return 0;
}
/*
* 显示一个位置上的全部盘子
* 没有返回值
* 参数表:
* v-表示要显示的位置(数组)
*/
void disp( int v[] )
{
cout << "{ ";//首尾用花括号分隔
for( int i=1; i<=v[0]; i++ )//输出每个盘子
cout << v[i] << " ";
cout << "} ";
}
/*
* 输出所有三个位置上的盘子
*/
void disp( )
{
disp( a );
disp( b );
disp( c );
cout << endl;//换行
}
/*
* 移动汉诺塔,使用了递归技术
* 把n个盘子从src位置移动到dst位置,以tmp位置作中转
* 没有返回值
* 参数表:
* n-要移动的盘子个数
* src-要移动的盘子的位置
* dst-盘子要移动到的目标位置
* tmp-中转位置
*/
void hano( int n, int src[], int dst[], int tmp[] )
{
if( n<=0 )//盘子的个数无效
return;
//把上面n-1个先移动到中转位置
hano( n-1, src, tmp, dst );
//最后一个盘子,直接移动
dst[++dst[0]] = src[src[0]--];
disp();//显示移动后的状态
//把刚才移动到中转位置那n-1个移动到目标位置
hano( n-1, tmp, dst, src );
}
----------------解决方案--------------------------------------------------------