关于算法竞赛一些基础问题,也就是《算法竞赛入门经典》第二版的第二章习题,用java再打一遍,附上一些问题的代码,方便自己调用。
1.水仙花数(daffodil)
输出100~999中的所有水仙花数。若3位数ABC满足ABC=A^3+B^3+C^3,则称其为水仙花 数。例如153=13+53+33,所以153是水仙花数。
int a,b,c;
for(int i=100;i<=999;i++){
a=i/100;
b=i/10%10;
c=i%10;
if(a*a*a+b*b*b+c*c*c==i){
System.out.println(i);//i为水仙花数
}
}
2.韩信点兵(hanxin)
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人 一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组 数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件 结束为止。
Scanner z = new Scanner(System.in);
int a, b, c, i;//i为总人数
a = z.nextInt();
b = z.nextInt();
c = z.nextInt();
for (i = 10; i <= 100; i++) {
if (i % 3 == a && i % 5 == b && i % 7 == c) {
System.out.println(i);
break;
}
}
if (i == 101) {
System.out.println("no answer");
}
3.倒三角形(triangle)
输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:
Scanner z = new Scanner(System.in);
int i, j, k, n;
n = z.nextInt();
for (i = n; i > 0; i--) {
for (k = 0; k < n - i; k++) {
System.out.print(" ");
}
for (j = 0; j < 2 * i - 1; j++) {
System.out.print("#");
}
System.out.println();
}
4.排列(permutation)
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。
//个人用数组返回,应该有更简单的方法
int i, j, k ;
for (i = 123; i <= 329; i++) {//i最小为123,最大为329
j = i * 2;
k = i * 3;
int sum = 0, mul = 1;
int[] sumMul = { sum, mul };
sumMul = result(i, sumMul[0], sumMul[1]);
sumMul = result(j, sumMul[0], sumMul[1]);
sumMul = result(k, sumMul[0], sumMul[1]);
if (sumMul[0] == 45 && sumMul[1] == 362880) {
System.out.println(i + " " + j + " " + k);
}
}
}
static int[] result(int m, int sum, int mul) {
int i = m / 100;
int j = m / 10 % 10;
int k = m % 10;
sum += i + k + j;
mul *= i * j * k;
int[] summul = { sum, mul };
return summul;
}
总结:是些比较简单的例题,但是从头再敲一遍,却用了近半个小时,应该对较简单的循环更具有熟练度。