(第七屆藍橋杯個人賽省賽)結果填空、程式碼填空
阿新 • • 發佈:2019-02-07
一、煤球數目(暴力解法,容易)
有一堆煤球,堆成三角稜錐形。具體:
第一層放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是不是相等的地方最好不要按照題目給出的方式去算。最好都轉換成乘法。