一、煤球数目(暴力解法,容易)
有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
....
如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
分析:
不难看出,层与层之间是有关系的。
n = 1时,第n层的煤球数 = 1;
n >= 2时, 第n层的煤球数 = 第n层的层数 + 第n-1层的煤球数;
public class Main {
/**
* 煤球数目
*/
public static void main(String[] args) {
int sum = 0;
int n = 0;
for (int i = 1; i <= 100 ; i++) {
n += i;//计算出该层的煤球数
sum += n;
}
System.out.println(sum);
}
}
二、生日蜡烛(暴力解法,容易)
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
分析:
不知道从几岁开始,所以大致估计一个范围,在这里假设就是10岁~40岁之间。这个假设就相当于给出了for循环的范围。针对这个范围里每一个数,比如15岁,从这个数开始(包括本身),每过一次生日,就加一次岁数,这样一直加,加到最后无非就是2种结果:一是等于题目规定的数,二是大于题目规定的数。最后,把等于规定的数的最开始的岁数输出即可。
public class Main {
/**
* 生日蜡烛
*/
public static void main(String[] args) {
int total = 236;
int flag = 0;
for (int i = 10; i <=40; i++) {
int sum = i;
for (int j = i+1; ; j++) {
sum += j;
if (sum == total) {
flag = 1;
break;
}
if(sum > 236){
break;
}
}
if (flag == 1) {
System.out.println(i);
break;
}
}
}
}
需要注意的地方:
每一次新的外层循环都要把sum重新赋值。
三、凑算式
B DEF
A + --- + ------- = 10
C GHI
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
分析:
本题是个填空题,出于实用性优先的原则,这个题不需要很复杂的算法,用暴力破解就可以了。
import java.util.HashSet;
import java.util.Set;
public class Main {
/**
* 凑算式
*/
static boolean test(String s){
Set<Character> sc = new HashSet<Character>();
for(int i = 0; i < s.length();i++){
sc.add(s.charAt(i));
}
if (sc.size() < 9) {
return false;
}
return true;
}
public static void main(String[] args) {
int count =0;
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
for (int k = 1; k <= 9; k++) {
for (int l = 1; l <= 9; l++) {
for (int m = 1; m <= 9; m++) {
for (int n = 1; n <= 9; n++) {
for (int p = 1; p <= 9; p++) {
for (int q = 1; q <= 9; q++) {
for (int r = 1; r <= 9; r++) {
String s = ""+i+j+k+l+m+n+p+q+r;
int sum = (i*k*(p*100+q*10+r) + j*(p*100+q*10+r)+k*(l*100+m*10+n));
if (sum == 10*k*(p*100+q*10+r) && test(s)) {
count ++;
}
}
}
}
}
}
}
}
}
}
System.out.println(count);
}
}
这个程序跑出来需要30秒左右的时间。如果将判断函数test()取消,并写成if( i!=j && i != k && .....)
格式,运行时间快。
需要注意的地方:
在判断 算式和10是不是相等的地方最好不要按照题目给出的方式去算。最好都转换成乘法。