1、第四届蓝桥杯 软件类省赛真题 第一题:猜年龄
美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。” 请你推算一下,他当时到底有多年轻。
for(let a = 1; a < 100; a++) {
if(a*a*a > 999 && a*a*a < 10000) {
if(a*a*a*a > 99999 && a*a*a*a < 1000000) {
let o = '' + a*a*a + a*a*a*a;
if(o.includes(0) && o.includes(1) && o.includes(2) && o.includes(3) && o.includes(4) && o.includes(5) && o.includes(6) && o.includes(7) && o.includes(8) && o.includes(9) ){
console.log('他的年龄是:', a)
console.log('这个10位数是:', o)
}
}
}
}
2、大衍数列
中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。
它的前几项是:0、2、4、8、12、18、24、32、40、50 ...
其规律是:对偶数项,是序号平方再除2,奇数项,是序号平方减1再除2。
以下的代码打印出了大衍数列的前 100 项。
for(let i = 1; i < 100; i++ ) {
if(i%2 == 0) {
console.log(i*i/2)
} else {
console.log((i*i-1)/2)
}
}
3、第几天
2000年的1月1日,是那一年的第1天。
那么,2000年的5月4日,是那一年的第几天?
注意:需要提交的是一个整数,不要填写任何多余内容。
function getDay(time) {
const year = time.slice(0, 4) // 获取年份
const month = time.slice(4, 6) // 获取月份
const day = time.slice(6, 8) // 获取天数
//判断是平年还是闰年
let isYear = false // 默认平年 2月只有28天
if(year%4 == 0) {
isYear = true
}
let allDay = day>>0 // 总天数
for(let i = 1; i < month; i ++ ) {
if (i ==1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) {
allDay = allDay + 31
}
if (i == 4 || i == 6 || i == 9 || i == 11) {
allDay = allDay + 30
}
if (i == 2) {
if(isYear) {
allDay = allDay + 29
} else {
allDay = allDay + 28
}
}
}
console.log('总共:' , allDay )
}
getDay('20000504')
4、对一个方阵转置,就是把原来的行号变列号,原来的列号变行号。
let data = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]
let string = ''
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data[i].length; j++) {
string = string + data[i][j] + ' '
}
string = string + '\n'
}
// 原始矩阵
console.log(string)
string = ''
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data[i].length; j++) {
string = string + data[j][i] + ' '
}
string = string + '\n'
}
console.log(string)
string = ''
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data[i].length; j++) {
string = string + data[i][data[i].length - 1 - j] + ' '
}
string = string + '\n'
}
console.log(string)
string = ''
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data[i].length; j++) {
string = string + data[data.length - 1 - i][data[i].length - 1 - j] + ' '
}
string = string + '\n'
}
console.log(string)
5、假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。 如果X=10,Y=90 呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。
let X = 10
let Y = 90
for (let i = 0.5; i <= 60; i++) {
if (i >= 1) {
if ((i - 0.5) % 2 == 0) {
Y = Y * 2
}
if ((i - 0.5) % 3 == 0) {
X = X * 2
}
}
Y = Y - X
}
console.log(X, Y)
6、成绩统计
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
let n = 24
let num = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 11, 21, 32, 43, 54, 65, 76, 87, 98, 88, 90, 98, 93]
let passRate = 0
let excellentRate = 0
for (let i = 0; i < num.length; i++) {
if (num[i] >= 60) {
passRate = passRate + 1
}
if (num[i] >= 85) {
excellentRate = excellentRate + 1
}
}
passRate = (passRate / n * 100).toFixed(2) + '%'
excellentRate = (excellentRate / n * 100).toFixed(2) + '%'
console.log(passRate, excellentRate)
7、高斯日记,日期计算,星系炸弹
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,
它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。高斯获得博士学位的那天日记上标着:8113
请你算出高斯获得博士学位的年月日?
// 获取现在的年份
let newYear = (new Date()).getFullYear()
// 从出生那一年开始计算
let totalDay = 0
// 出生年份
let beginYear = 1777
// 出生月份
let beginMonth = 4
// 出生日期
let beginDay = 30
// 是否闰年
let isRun = false
// 总天数
let allDay = 8113
// 最终年份
let endYear = 0
// 最终月份
let endMonth = 0
// 最终日期
let endDay = 0
console.log(newYear)
for (let i = beginYear; i < newYear; i++) {
if (allDay >= totalDay) {
endYear = i
// 判断是否闰年
if (i % 4 == 0) {
isRun = true
} else {
isRun = false
}
console.log(endYear, totalDay, allDay)
// 循环月份
for (let m = beginMonth; m < 13; m++) {
if (allDay >= totalDay) {
endMonth = m
if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
if (allDay - totalDay <= 31) {
endDay = allDay - totalDay
totalDay = totalDay + 31
} else {
if (beginDay != 0) {
totalDay = 32 - beginDay
} else {
totalDay = totalDay + 31
}
}
}
if (m == 4 || m == 6 || m == 9 || m == 11) {
if (allDay - totalDay <= 30) {
endDay = allDay - totalDay
totalDay = totalDay + 30
} else {
if (beginDay != 0) {
totalDay = 31 - beginDay
} else {
totalDay = totalDay + 30
}
}
}
if (m == 2) {
if (isRun) {
if (allDay - totalDay <= 29) {
endDay = allDay - totalDay
totalDay = totalDay + 29
} else {
if (beginDay != 0) {
totalDay = 30 - beginDay
} else {
totalDay = totalDay + 29
}
}
} else {
if (allDay - totalDay <= 28) {
endDay = allDay - totalDay
totalDay = totalDay + 28
} else {
if (beginDay != 0) {
totalDay = 29 - beginDay
} else {
totalDay = totalDay + 28
}
}
}
}
beginMonth = 1
beginDay = 0
}
}
} else {
i = newYear
}
}
8、特别数的和
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。请问,在 1 到 n 中,所有这样的数的和是多少?
// 输入的那个数
let n = 40
// 总和数
let total = 0
for (let i = 0; i <= n; i++) {
let str = i + ' '
if (str.indexOf('0') != -1 || str.indexOf('1') != -1 || str.indexOf('2') != -1 || str.indexOf('9') != -1) {
total = total + i
}
}
console.log(total)
9、跑步训练
小明要做一个跑步训练。
初始时,小明充满体力,体力值计为10000。如果小明跑步,每分钟损耗600的体力。
如果小明休息,每分钟增加300的体力。体力的损耗和增加都是均匀变化的。
小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。
如果某个时刻小明的体力到达0,他就停止锻炼。
请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。
// 初始体力
let beginSpirit = 10000
// 开始运动分钟数
let begin = 0
// 开始运动秒数
let totalSecond = 0
// 判断是都还可以运动一分钟
let isNeed = 0
while (beginSpirit > 0) {
// 判断是否还要一分钟
if (beginSpirit >= 600) {
++begin
if (begin % 2 == 1) {
beginSpirit = beginSpirit - 600
}
if (begin % 2 == 0) {
beginSpirit = beginSpirit + 300
}
} else {
isNeed = beginSpirit / 10
beginSpirit = beginSpirit - 600
}
}
if (isNeed != 0) {
totalSecond = begin * 60 + isNeed
} else {
totalSecond = begin * 60
}
console.log(begin, totalSecond)
10、蛇形填数
如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。
1 2 4 7 11....
3 5 8 12...
6 9 13....
10 14....
15.....
容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行 20列是什么?
// 第20行第20列
let n = 20
// 前n-1列表的和
let total = 0
for (let i = 1; i < 2 * n; i++) {
if (n == (i + 1) / 2) {
total = total + (i + 1) / 2
} else {
total = total + i
}
}
console.log(total)