(a+b)的n次幂的展开式中各项的系数很有规律,对于n=2,3,4时分别是:1 2 1, 1 3 3 1,1 4 6 4 1。这些系数构成了著名的杨辉三角形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
下列的程序给出了计算第m层的第n个系数的计算方法,试完善之(m,n都从0算起)。
public static int f(int m, int n)
{
if(m==0) return 1;
if(n==0 || n==m) return 1;
return __________________________;
}
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。
------解决方案--------------------
第一题:f((m-1),(n-1))+f((m-1),n);
就是其左上角的数,与正上面的数之和。
------解决方案--------------------
import java.util.Scanner;
public class PascalTriangle {
public static void main(String[] args) {
System.out.print("Please input a digit for pascal triangle: ");
Scanner scanner = new Scanner(System.in);
final int num = scanner.nextInt();
int[][] ary = getPascalTriangle(num);
for(int[] item: ary){
for(int value: item){
System.out.print((value > 0? value: "") + " ");
}
System.out.println();
}
}
private static int[][] getPascalTriangle(final int num) {
int[][] ary = new int[num][num];
for(int i = 0; i < ary.length; i++){
ary[i][0] = 1;
ary[i][i] = 1;
}
for(int i = 1; i < ary.length; i++){
for(int j = 1; j <= i; j++){
ary[i][j] = ary[i-1][j-1] + ary[i-1][j];
}
}
return ary;
}
}
百度一下
------解决方案--------------------
第二题我的思路。
先定义一个数组,长度99999。
int[] record = new int[99999];
for (int i = 1; i < 99999; i++) {
int temp = i;
while(true) {
int minValue = getMinValue(temp);
if (record[minValue] == 0) {
//没出现过,设置为已出现
record[minValue] = 1;
} else {
if (record[minValue] == 1) {
//出现过,黑洞成型,输出黑洞值。
......
record[minValue] == 2;
break;
} else {
//出现过,而且输出过黑洞值,退出,看下一个值。
break;
}
}
int maxValue = getMaxValue(temp);
temp = maxValue - minValue;
}
}
细节没具体写,估计应该可以完成任务吧。
------解决方案--------------------
终于让我做出第二题了,不容易啊
- Java code
import java.util.*;public class Test { public static int maxNum(int num) { int[] place = new int[5]; for (int i = 0; i < 5; i++) { place[i] = num % 10; num /= 10; } Arrays.sort(place); int maxNum = 0; for (int i = 4; i >= 0; i--) { maxNum *= 10; maxNum += place[i]; } return maxNum; } public static int minNum(int num) { int[] place = new int[5]; for (int i = 0; i < 5; i++) { place[i] = num % 10; num /= 10; } Arrays.sort(place); int minNum = 0; for (int i = 0; i < 5; i++) { minNum *= 10; minNum += place[i]; } return minNum; } public static void main(String[] args) { int[] bNumUsed = new int[100000]; //用来标记数字,-1表示没有用过,不为-1表示在第几轮的循环里面 ArrayList<ArrayList<Integer>> circleList = new ArrayList<ArrayList<Integer>>(); ArrayList<Integer> circle = new ArrayList<Integer>(); for (int i = 0; i < bNumUsed.length; i++) { bNumUsed[i] = -1; } loop: for (int i = 0; i < 100000; i++) { //System.out.println(i); if (bNumUsed[i] != -1) { continue loop; } for (int t = i; t != 0;) { if (bNumUsed[t] == -1) { bNumUsed[t] = i; circle.add(t); t = maxNum(t) - minNum(t); } else if (bNumUsed[t] != i) { circle = new ArrayList<Integer>(); continue loop; } else { t = circle.indexOf(t); for (int j = 0; j < t; j++) { circle.remove(0); } circleList.add(circle); circle = new ArrayList<Integer>(); continue loop; } } } for (ArrayList<Integer> cir : circleList) { System.out.println(cir); } }}