使用JavaScript解答2018第九届蓝桥杯C/C++省赛A组试题
大三時參加過第七屆藍橋杯個人賽及團隊賽,轉眼已經兩年,最近看了看第九屆藍橋杯試題,打算用JavaScript實現一下。
題目1
標題:分數
1/1 + 1/2 + 1/4 + 1/8 + 1/16 + ….
每項是前一項的一半,如果一共有20項,
求這個和是多少,結果用分數表示出來。
類似:3/2 。當然,這只是加了前2項而已。分子分母要求互質。
注意:
需要提交的是已經約分過的分數,中間任何位置不能含有空格。請不要填寫任何多余的文字或符號。
解答:
以下討論不使用數學公式,僅使用JavaScript編程解決的方法。
class Question1 {constructor () {this.result = ''}// 輔助方法->求兩個數的最小公倍數lcm (a, b) {const minNum = Math.min(a, b)const maxNum = Math.max(a, b)let temp = 0for (let i = minNum; i <= maxNum; i++) {temp = minNum * iif (temp % maxNum === 0) {return tempbreak}}}// 輔助方法->求兩個數的最大公約數gcd (a, b) {const minNum = Math.min(a, b)const maxNum = Math.max(a, b)for (let i = minNum; i > 0; i--) {if (maxNum % i === 0 && minNum % i ===0) {return i}}}// 主方法calculate () {let a = []let numerator = 1let denominator = 1// 將分數推送進二維數組,第一個元素為分子,第二個元素為分母for (let i = 0; i < 20; i++) {a[i] = [numerator, denominator]denominator *= 2}// 求所有分母最小公倍數let lcmResult = 0for (let i = 0; i < a.length; i++) {lcmResult = this.lcm(a[i][0], a[i][1])}// numeratorSum (通分后的分子共和,初始化為0)let numeratorSum = 0// 分子乘以(最小公倍數/分母),分母都變為lcmResult,即:通分for (let i = 0; i < a.length; i++) {a[i][0] *= lcmResult / a[i][1]a[i][1] = lcmResultnumeratorSum += a[i][0]}// 求分子分母最大公約數const gcdResult = this.gcd(numeratorSum, lcmResult)// 計算結果if (gcdResult === 1) {this.result = numeratorSum + '/' + lcmResult} else {this.result = numeratorSum / gcdResult + '/' + lcmResult / gcdResult}}// 展示結果display () {console.log('結果為:' + this.result)} } const obj = new Question1() obj.calculate() obj.display()在node環境執行此js文件,如:node Question1.js,可得到結果為:1048575/524288,如下:
解析請看源碼中的注釋,請從實例化對象部分(Question1類外)開始閱讀。
題目2
標題:星期一
整個20世紀(1901年1月1日至2000年12月31日之間),一共有多少個星期一?
以下為本人使用JavaScript解答的源碼,相關解釋請查看代碼中的注釋:
使用node運行此js文件,如:node Question2.js,可得到以下結果:
可見運行結果為5217。
題目3
標題:乘積尾零
如下的10行數據,每行有10個整數,請你求出它們的乘積的末尾有多少個零?
5650 4542 3554 473 946 4114 3871 9073 90 4329
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899
1486 5722 3135 1170 4014 5510 5120 729 2880 9019
2049 698 4582 4346 4427 646 9742 7340 1230 7683
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649
6701 6645 1671 5978 2704 9926 295 3125 3878 6785
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074
689 5510 8243 6114 337 4096 8199 7313 3685 211
以下為本人使用JavaScript解答的源碼,相關解釋代碼中的注釋:
// Created by xiaoqiang on 29/05/2018.// 創建二維數組 let array = [[5650, 4542, 3554, 473, 946, 4114, 3871, 9073, 90, 4329], [2758, 7949, 6113, 5659, 5245, 7432, 3051, 4434, 6704, 3594], [9937, 1173, 6866, 3397, 4759, 7557, 3070, 2287, 1453, 9899], [1486, 5722, 3135, 1170, 4014, 5510, 5120, 729, 2880, 9019], [2049, 698 ,4582, 4346, 427, 646, 9742, 7340, 1230, 7683], [5693, 7015, 6887, 7381, 4172, 4341, 2909, 2027, 7355, 5649], [6701, 6645, 1671, 5978, 2704, 9926, 295, 3125, 3878, 6785], [2066, 4247, 4800, 1578, 6652, 4616, 1113, 6205, 3264, 2915], [3966, 5291, 2904, 1285, 2193, 1428, 2265, 8730, 9436, 7074], [689, 5510, 8243, 6114, 337 ,4096, 8199, 7313, 3685, 211]]// 零的總數 let sum = 0 // 元素末尾為2的數量 let endWithTwo = 0 // 元素末尾為5的數量 let endWithFive = 0 for (let i = 0; i < 10; i++) {for (let j = 0; j < 10; j++) {while (array[i][j] % 10 === 0) {// 元素末尾為0,兩數乘積末尾必為0,直接加1sum += 1// 減去此元素末尾的一個0array[i][j] /= 10}while (array[i][j] % 2 === 0) {endWithTwo += 1array[i][j] /= 2}while (array[i][j] % 5 === 0) {endWithFive += 1array[i][j] /= 5}} } // 元素末尾為2的數量與元素末尾為5的數量比較,取小的,因為多出來那個也沒對應的和它相乘,不會產生0。 let select = endWithTwo > endWithFive ? endWithFive : endWithTwo // 將 sum += select console.log('乘積的末尾有' + sum + '個零')使用node運行此js文件,如:node Question3.js,可得到以下結果:
可見結果為:31
有錯誤歡迎指出,其他題目有空再來解答,晚安。
總結
以上是生活随笔為你收集整理的使用JavaScript解答2018第九届蓝桥杯C/C++省赛A组试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git pull 错误:fatal: r
- 下一篇: s3c2440移植MQTT