蓝桥杯--基础(一)

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Root1216

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值