蓝桥杯—穷举2

标题: 马虎的算式

    小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

    有一次,老师出的题目是:36 x 495 = ?

    他却给抄成了:396 x 45 = ?

    但结果却很戏剧性,他的答案竟然是对的!!

    因为 36 * 495 = 396 * 45 = 17820

    类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54

    假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)

    能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?

请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数
#include <iostream>
using namespace std;

int main()
{
    int count=0;
    for(int a=1; a<=9; a++)
    {
        for(int b=1; b<=9; b++)
        {
            for(int c=1; c<=9; c++)
            {
                for(int d=1; d<=9; d++)
                {
                    for(int e=1; e<=9; e++)
                    {
                        if(a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e)
                        {
                            if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e))
                                count++;
                        }
                    }
                }
            }
        }
    }
    cout<<"共"<<count<<"个"<<endl;
    return 0;
}


运行结果:


2016年第7届第三题

解法一:
因小数数字运算会导致麻烦的问题,所以对其式子通分。

#include <iostream>
using namespace std;
int main()
{
    int s=0;
    for(int a=1; a<=9; a++)
    {
        for(int b=1; b<=9; b++)
        {
            if(b==a)
                continue;
            for(int c=1; c<=9; c++)
            {
                if(c==a||c==b)
                    continue;
                for(int d=1; d<=9; d++)
                {
                    if(d==a||d==b||d==c)
                        continue;
                    for(int e=1; e<=9; e++)
                    {
                        if(e==a||e==b||e==c||e==d)
                            continue;
                        for(int f=1; f<=9; f++)
                        {
                            if(f==a||f==b||f==c||f==d||f==e)
                                continue;
                            for(int g=1; g<=9; g++)
                            {
                                if(g==a||g==b||g==c||g==d||g==e||g==f)
                                    continue;
                                for(int h=1; h<=9; h++)
                                {
                                    if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)
                                        continue;
                                    for(int i=1; i<=9; i++)
                                    {
                                        if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h)
                                            continue;
                                        int t1=a*c*(100*g+10*h+i);
                                        int t2=b*(100*g+10*h+i);
                                        int t3=c*(100*d+10*e+f);
                                        int t4=10*c*(100*g+10*h+i);
                                        if(t1+t2+t3==t4)
                                            s++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    cout<<s<<endl;
    return 0;
}

解法二:

式子直接乘1.0

#include <iostream>
using namespace std;
int main()
{
    int s=0;
    for(int a=1; a<=9; a++)
    {
        for(int b=1; b<=9; b++)
        {
            if(b==a)
                continue;
            for(int c=1; c<=9; c++)
            {
                if(c==a||c==b)
                    continue;
                for(int d=1; d<=9; d++)
                {
                    if(d==a||d==b||d==c)
                        continue;
                    for(int e=1; e<=9; e++)
                    {
                        if(e==a||e==b||e==c||e==d)
                            continue;
                        for(int f=1; f<=9; f++)
                        {
                            if(f==a||f==b||f==c||f==d||f==e)
                                continue;
                            for(int g=1; g<=9; g++)
                            {
                                if(g==a||g==b||g==c||g==d||g==e||g==f)
                                    continue;
                                for(int h=1; h<=9; h++)
                                {
                                    if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)
                                        continue;
                                    for(int i=1; i<=9; i++)
                                    {
                                        if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h)
                                            continue;
                                        if((a+(b*1.0/c)+(d*100+e*10+f)*1.0/(g*100+h*10+i))==10)
                                            s++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    cout<<s<<endl;
    return 0;
}

运行结果:
29

2016年第7届第6题

解:

依次判断每一个格子,后面的格子不用管

#include <iostream>
using namespace std;
int main()
{
    int s=0;
    for(int a=0; a<=9; a++)
    {
        for(int b=0; b<=9; b++)
        {
            if((b==(a+1))||(b==(a-1)))
                continue;
            for(int c=0; c<=9; c++)
            {
                if((c==(b+1))||(c==(b-1)))
                    continue;
                for(int d=0; d<=9; d++)
                {
                    if((d==(a+1))||(d==(a-1)))
                        continue;
                    for(int e=0; e<=9; e++)
                    {
                        if((e==(a+1))||(e==(a-1))||(e==(d+1))||(e==(d-1))||(e==(b+1))||(e==(b-1)))
                            continue;
                        for(int f=0; f<=9; f++)
                        {
                            if((f==(b+1))||(f==(b-1))||(f==(e+1))||(f==(e-1))||(f==(a-1))||(f==(a+1))||(f==(c-1))||(f==(c+1)))
                                continue;
                            for(int g=0; g<=9; g++)
                            {
                                if((g==(c+1))||(g==(c-1))||(g==(f+1))||(g==(f-1))||(g==(b+1))||(g==(b-1)))
                                    continue;
                                for(int h=0; h<=9; h++)
                                {
                                    if((h==(d+1))||(h==(d-1))||(h==(e+1))||(h==(e-1)))
                                        continue;
                                    for(int i=0; i<=9; i++)
                                    {
                                        if((i==(h+1))||(i==(h-1))||(i==(e+1))||(i==(e-1))||(i==(d+1))||(i==(d-1))||(i==(f+1))||(i==(f-1)))
                                            continue;
                                        for(int j=0; j<=9; j++)
                                        {
                                            if((j==(i+1))||(j==(i-1))||(j==(f+1))||(j==(f-1))||(j==(e+1))||(j==(e-1))||(j==(g+1))||(j==(g-1)))
                                                continue;

                                            s++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    cout<<s<<endl;
    return 0;
}

运行结果:
206059714

2015第6届第1题

奖券数目

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

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

#include <iostream>
using namespace std;
int main()
{
    int count=0;
    for(int i=1; i<10; i++)
    {
        if(i==4)
            continue;
        for(int j=0; j<10; j++)
        {
            if(j==4)
                continue;
            for(int k=0; k<10; k++)
            {
                if(k==4)
                    continue;
                for(int l=0; l<10; l++)
                {
                    if(l==4)
                        continue;
                    for(int m=0; m<10; m++)
                    {
                        if(m==4)
                            continue;
                        count++;
                    }
                }
            }
        }

    }
    cout<<count<<endl;
    cout<<8*9*9*9*9<<endl;  //第二种方法:第一位不取0和4,剩下四位不取4
    return 0;
}
运行结果:

52488

2015第6届第3题

三羊献瑞
观察下面的加法算式:
       祥 瑞生 辉
 +    三羊 献 瑞
-------------------
 三 羊 生 瑞 气
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

#include <iostream>
using namespace std;
int main()
{
    for(int a=1; a<10; a++)
    {
        for(int b=0; b<10; b++)
        {
            if(b==a)
                continue;
            for(int c=0; c<10; c++)
            {
                if(c==a||c==b)
                    continue;
                for(int d=0; d<10; d++)
                {
                    if(d==a||d==b||d==c)
                        continue;
                    for(int e=1; e<10; e++)
                    {
                        if(e==a||e==b||e==c||e==d)
                            continue;
                        for(int f=0; f<10; f++)
                        {
                            if(f==a||f==b||f==c||f==d||f==e)
                                continue;
                            for(int g=0; g<10; g++)
                            {
                                if(g==a||g==b||g==c||g==d||g==e||g==f)
                                    continue;
                                for(int h=0; h<10; h++)
                                {
                                    if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)
                                        continue;
                                    int t1=a*1000+b*100+c*10+d;
                                    int t2=e*1000+f*100+g*10+b;
                                    int t3=e*10000+f*1000+c*100+b*10+h;
                                    if(t1+t2==t3)
                                        cout<<e<<" "<<f<<" "<<g<<" "<<b<<endl;
                                }
                            }
                        }
                    }
                }
            }
        }

    }
    return 0;
}

运行结果:

2014年第5届第6题

标题:奇怪的分式

    上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:

    1/4 乘以 8/5

    小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)

    老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!

    对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?

    请写出所有不同算式的个数(包括题中举例的)。

    显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。

    但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!

注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。

思路:

     

#include <iostream>
using namespace std;
int main()
{
    int count=0;
    int a,b,c,d;
    for(a=1; a<10; a++)
    {
        for(b=1; b<10; b++)
        {
            for(c=1; c<10; c++)
            {
                for(d=1; d<10; d++)
                {
                    if(a==c||b==d)   
                        continue;
                    if((a*b)*1.0/(c*d)==(a*10+b)*1.0/(c*10+d))   //注意*1.0
                        count++;
                }
            }
        }
    }
    cout<<count<<endl;
    return 0;
}
运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值