有两道试题要请问大家
(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);
}
}
}