1464: [蓝桥杯2019初赛]数的分解 【水题】有点意思

在这里插入图片描述
http://oj.ecustacm.cn/problem.php?id=1464

解析:
在这里插入图片描述
上图隐含的条件: i,j,k 为循环变量 i<j<k 或 i>j>k 避免重复

直接暴力

#include<cstdio>
bool judge(int n)
{
    
    
    while(n)
    {
    
    
        int temp=n%10;
        if(temp==2||temp==4)
            return false;
        n=n/10;
    }
    return true;
}
int main(void)
{
    
    
    int i,j,k;
    int c=0;
    for(i=1;i<=2019;i++)
    {
    
    
        for(j=1;j<i;j++)
        {
    
    
            for(k=1;k<j;k++)
            {
    
    
                if(judge(i)&&judge(j)&&judge(k))
                {
    
    
                    if(i!=j&&i!=k&&j!=k)
                    {
    
    
                        if(i+j+k==2019)
                            c++;
                    }
                }
            }
        }
    }
    printf("%d\n",c);
    return 0;
}

简化版,更容易理解,依次递增

#include<cstdio>
bool judge(int n)
{
    
    
    while(n)
    {
    
    
        int temp=n%10;
        if(temp==2||temp==4)
            return false;
        n=n/10;
    }
    return true;
}
int main(void)
{
    
    
    int i,j,k;
    int c=0;
    for(i=1;i<=2019;i++)
    {
    
    
        for(j=i+1;j<=2019;j++)
        {
    
    
            for(k=j+1;k<=2019;k++)
            {
    
    
                if(judge(i)&&judge(j)&&judge(k))
                {
    
    
                    if(i!=j&&i!=k&&j!=k)
                    {
    
    
                        if(i+j+k==2019)
                            c++;
                    }
                }
            }
        }
    }
    printf("%d\n",c);
    return 0;
}

精进一下: 3个数不相同,那么一定是一个递增的数列 2019/3=673
说明三个数中最小的数的取值范围为 1 ~ 673

#include<cstdio>
bool judge(int n)
{
    
    
    while(n)
    {
    
    
        int temp=n%10;
        if(temp==2||temp==4)
            return false;
        n=n/10;
    }
    return true;
}
int main(void)
{
    
    
    int i,j,k;
    int c=0;
    for(i=1;i<=673;i++)
    {
    
    
        for(j=i+1;j<=2019;j++)
        {
    
    
            for(k=j+1;k<=2019;k++)
            {
    
    
                if(judge(i)&&judge(j)&&judge(k))
                {
    
    
                    if(i!=j&&i!=k&&j!=k)
                    {
    
    
                        if(i+j+k==2019)
                            c++;
                    }
                }
            }
        }
    }
    printf("%d\n",c);
    return 0;
}

再在上一个的代码优化:
因为是一个递增的数列
故 i+j*2<2019 , k=2019-i-j
这样的话循环的次数大幅的减少。且不用判断 i+j+k==2019了

#include<cstdio>
bool judge(int n)
{
    
    
    while(n)
    {
    
    
        int temp=n%10;
        if(temp==2||temp==4)
            return false;
        n=n/10;
    }
    return true;
}
int main(void)
{
    
    
    int i,j,k;
    int c=0;
    for(i=1;i<=673;i++)
    {
    
    
        for(j=i+1;j*2+i<2019;j++)
        {
    
    
        	k=2019-i-j;
            if(judge(i)&&judge(j)&&judge(k))
            {
    
    
       			c++;
            }
        }
    }
    printf("%d\n",c);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/bettle_king/article/details/115215735