LQ0021 奖券数目组合+枚举

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0021 奖券数目组合+枚举相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2015初赛 C++ B组D题

题目描述
有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。
某抽奖活动奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码。
主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。

输出格式
请提交该数字(一个整数),不要写任何多余的内容或说明性文字。

问题分析
这是一个填空题,只要填入计算结果即可。用程序来解可以有多种解法。
本题可以有多种解法。
解法一:给出基于组合的算式应该最简单的一种。总共5位数字,最高位可以取0和4以外的数字,其他各位可以选4以外的数字。所以奖券的数量为89990=52488。
方法二:使用C++字符串类string的操作来实现。
方法三:根据进制原理,取出每一位数字进行判定,再进行统计计算。
方法四:用C语言字符串库函数strchr()来进行统计计算。

程序说明
通过本博文的题解,可以了解各种编程技巧。

AC的C语言程序(组合)如下:

/* LQ0021 奖券数目 */

#include <stdio.h>

int main()

    printf("%d\\n", 8 * 9 * 9 * 9 * 9);
    return 0;

AC的C++语言程序(字符串操作)如下:

/* LQ0021 奖券数目 */

#include <iostream>

using namespace std;

int main()

    int cnt = 0;
    for (int i = 10000; i <= 99999; i++) 
        string s = to_string(i);
        if (s.find('4') == string::npos)
            cnt++;
    
    cout << cnt << endl;

    return 0;

AC的C语言程序(进制)如下:

/* LQ0021 奖券数目 */

#include <stdio.h>

int main()

    int cnt = 0;
    for (int i = 10000; i <= 99999; i++) 
        int t = i;
        while (t) 
            if (t % 10 == 4) 
                cnt++;
                break;
             else
                t /= 10;
        
    

    printf("%d\\n", 99999 - 10000 + 1 - cnt);

    return 0;

AC的C语言程序(字符串函数)如下:

/* LQ0021 奖券数目 */

#include <stdio.h>
#include <string.h>

char s[5 + 1];

int main()

    int cnt = 0;
    for (int i = 10000; i <= 99999; i++) 
        sprintf(s, "%d", i);
        if (strchr(s, '4') == NULL)
            cnt++;
    

    printf("%d\\n", cnt);

    return 0;

以上是关于LQ0021 奖券数目组合+枚举的主要内容,如果未能解决你的问题,请参考以下文章

2015_B t1奖券数目

第六届蓝桥杯真题总结

奖券题目

dp(01背包问题)

#1038 : 01背包

01背包----简单DP