LQ0005 数的分解枚举+进制

Posted 海岛Blog

tags:

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

题目出处:蓝桥杯2019初赛

题目描述
把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。

题目分析
用枚举法来解决。
写一个判定正整数是否含有数字2和4,根据进制原理来实现。
枚举三个数i、j和k,使其满足0<i<j<k,可以减少计算量。k可以不用枚举,用i和j算出,k=2019-i-j,可以减少枚举大幅减少计算量。
还有一种算法,先把1-2019之间的不含有2和4数字的数算出来,再枚举这些数,可以避免重复判定。

AC的C语言程序如下:

/* LQ0005 数的分解 */

#include <stdio.h>

const int N2019 = 2019;
const int N = 2019 / 3;

int judge(int n)

    while (n) 
        int t = n % 10;
        if (t == 2 || t == 4)
            return 1;
        n /= 10;
    
    return 0;


int main()

    int cnt = 0;
    for (int i = 1; i <= N; i++) 
        if (judge(i))
            continue;
        for (int j = i + 1, k; j <= N2019; j++) 
            if (judge(j))
                continue;
            if ((k = N2019 - i - j) > j) 
                if (judge(k)) continue;
                else cnt++;
             else
                break;
        
    

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

    return 0;

以上是关于LQ0005 数的分解枚举+进制的主要内容,如果未能解决你的问题,请参考以下文章

LQ0041 特别数的和进制

LQ0268 古堡算式枚举+进制

LQ0268 古堡算式枚举+进制

LQ0203 排它平方数枚举+进制

LQ0205 马虎的算式枚举+进制

LQ0209 颠倒的价牌枚举+进制