蓝桥杯赛前模拟

试题 A: 合数个数
本题总分:5 分
【问题描述】
一个数如果除了 1 和自己还有其他约数,则称为一个合数。例如:1, 2, 3
不是合数,4, 6 是合数。
请问从 1 到 2020 一共有多少个合数。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

#include<stdio.h>
int main()
{
	int i,j,sum;
	sum = 0;
	for(i = 4;i<=2020;i++)
	{
		for(j = 2;j<i;j++)
		{
			if(i%j==0)
			{
				sum++;
				break;
			}
		}
	}
	printf("%d",sum);
	return 0;
}

试题 B: 含 2 天数
本题总分:5 分
【问题描述】
小蓝特别喜欢 2,今年是公元 2020 年,他特别高兴,因为每天日历上都可
以看到 2。
如果日历中只显示年月日,请问从公元 1900 年 1 月 1 日到公元 9999 年 12
月 31 日,一共有多少天日历上包含 2。即有多少天中年月日的数位中包含数字
2。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

#include <stdio.h>
#include <stdbool.h>

bool containsDigit2(int n) {
    // 判断 n 是否包含数字 2
    while (n > 0) {
        if (n % 10 == 2) {
            return true;
        }
        n /= 10;
    }
    return false;
}

int main() {
    int year, month, day;
    int total_days = 0;  // 记录包含数字 2 的总天数

    for (year = 1900; year <= 9999; year++) {
        for (month = 1; month <= 12; month++) {
            int days_in_month;
            if (month == 2) {
                // 处理闰年和平年的情况
                if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                    days_in_month = 29;
                } else {
                    days_in_month = 28;
                }
            } else if (month == 4 || month == 6 || month == 9 || month == 11) {
                days_in_month = 30;
            } else {
                days_in_month = 31;
            }

            for (day = 1; day <= days_in_month; day++) {
                // 判断当前日期是否包含数字 2
                if (containsDigit2(year) || containsDigit2(month) || containsDigit2(day)) {
                    total_days++;
                }
            }
        }
    }

    printf("从1900年1月1日到9999年12月31日,共有%d天的年月日数位中包含数字2。\n", total_days);
    return 0;
}

试题 C: 本质上升序列
本题总分:10 分
【问题描述】
小蓝特别喜欢单调递增的事物。
在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺
序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。
例如,在字符串 lanqiao 中,如果取出字符 n 和 q,则 nq 组成一个单
调递增子序列。类似的单调递增子序列还有 lnq、i、ano 等等。
小蓝发现,有些子序列虽然位置不同,但是字符序列是一样的,例如取第
二个字符和最后一个字符可以取到 ao,取最后两个字符也可以取到 ao。小蓝
认为他们并没有本质不同。
对于一个字符串,小蓝想知道,本质不同的递增子序列有多少个?
例如,对于字符串 lanqiao,本质不同的递增子序列有 21 个。它们分别
是 l、a、n、q、i、o、ln、an、lq、aq、nq、ai、lo、ao、no、io、lnq、
anq、lno、ano、aio。
请问对于以下字符串(共 200 个小写英文字母,分四行显示):(如果你把
以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在
试题目录下有一个文件 inc.txt,内容与下面的文本相同)
tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf
iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqij
gihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad
vrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl
本质不同的递增子序列有多少个?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

#include <iostream>
#include <cstring>
using namespace std;

const int MAXN = 210;
int dp[MAXN][27];  // 下标从 1 开始,字母下标从 1 开始

int main() {
    char s[MAXN];
    cin >> (s + 1);  // 字符串下标从 1 开始

    int n = strlen(s + 1);
    for (int i = 1; i <= n; i++) {
        dp[i][s[i] - 'a' + 1] = 1;
        for (int j = 1; j <= 26; j++) {
            for (int k = 1; k < j; k++) {
                if (s[i] > k + 'a' - 1) {
                    dp[i][s[i] - 'a' + 1] += dp[i-1][k];
                }
            }
        }
    }

    int ans = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= 26; j++) {
            ans += dp[i][j];
        }
    }
    cout << ans << endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值