解决问题:
import java.math.BigInteger;
public class YangHuiSanJiao {
public static void main(String[] args){
System.out.println(solution(1000));
}
/**
* 求杨辉三角第n行第一个偶数出现的位置
* @param rowNum 第几行
* @return 第一个偶数出现的位置
* lizhen 2013/11/10 00:22
*/
public static int solution(int rowNum){
int result = 0;
if(rowNum == 1){ //第1行
return -1;
} else if(rowNum % 2 != 0){ //除第1行外,第奇数行
return 2;
} else { //第偶数行
result = location(rowNum);
}
return result;
}
/**
* 求组合数,组合数计算方法:C(n,m)=n!/[m!(n-m)!]
* @param start 相当于n
* @param num 相当于m
* @return 组合数
*/
public static BigInteger total(int start,int num){
BigInteger result = factorial(start,num).divide(factorial(start-num,0));
return result;
}
/**
* 求类似阶乘
* @param factor 因子
* @return 阶乘结果
*/
public static BigInteger factorial(int factor,int end){
BigInteger result = new BigInteger("1");
for(int i=factor;i>end;i--){
result = result.multiply(new BigInteger(i+""));
}
return result;
}
/**
* 求杨辉三角第偶数行第一个偶数出现的位置
* @param rowNum 第偶数行
* @return 第一个偶数出现的位置
* lizhen 2013/11/10 00:22
*/
public static int location(int evenNum){
int result = -1;
int length = evenNum;
int end = length/2; //由于杨辉三角对称,所以只判断第n行前一半数
for(int i=2;i<=end;i++){
BigInteger number = total(evenNum-1 , i-1);
if(number.mod(new BigInteger(2+"")).equals(new BigInteger("0"))){
result = i;
break;
}
}
return result;
}
}
杨辉三角性质:
前提:端点的数为1.
1、每个数等于它上方两数之和。
2、每行
数字左右对称,由1开始逐渐变大。
3、第n行的数字有n项。
4、第n行数字和为
。
5、第n行的第m个数和第n-m+1个数相等,即C(n-1,m-1)=C(n-1,n-m)(
组合数性质
之一)
6、每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即
7、第n行的m个数可表示为C(n-1,m-1)(n-1下标,m-1上标),即为从n-1个不同
组合数计算方法:C(n,m)=n!/[m!(n-m)!]
9、将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是第4n+1个
斐波那契数;将第2n行第2个数(n>1),跟第2n-1行第4个数、第2n-2行第6个数……这些数之和是第4n-2个
斐波那契数。
10、将各行数字相排列,可得11的N次方:1=11º 11=11¹ 121=11²
注:15101051≠11的5次方