猜生日蓝桥杯

21 篇文章 1 订阅
16 篇文章 2 订阅
这篇博客讲述了如何通过编程解决一个数学谜题:根据植树节(2012年3月12日)和额外提示,找出叔叔出生的年月日。叔叔出生的8位数能被当年的年、月、日整除,并且他是6月出生。博主给出了三种不同的C++代码实现来求解这个问题,最后得出叔叔出生于1955年6月4日。博客鼓励读者尝试更多解题方法并进行讨论。
摘要由CSDN通过智能技术生成

今年的植树节(2012 年 3 月 12 日),小明和他的叔叔还有小伙伴们一起去植树。休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!”

“把我出生的年月日连起来拼成一个 8 位数(月、日不足两位前补 0)正好可以被今天的年、月、日整除!”

他想了想,又补充到:“再给个提示,我是 6 月出生的。”

根据这些信息,请你帮小明算一下,他叔叔的出生年月日。

格式是年月日连成的 8 位数。例如,如果是 1948 年 6 月 12 日,就写:19480612。

答案:19550604

解法:可以采用单个数字,每一个数字为独立个体(最麻烦,一看就懂)

#include <iostream>

using namespace std;
 
void judge(int a,int b,int c,int d,int e,int f,int g,int h)
{
    if((e*10+f)<=12&&(g*10+h)<=31&&(a*1000+b*100+c*10+d)<2012&&(a*1000+b*100+c*10+d)>1900)
    {
        long long sum=a*10000000+b*1000000+c*100000+d*10000+e*1000+f*100+g*10+h;
        if(sum%2012==0&&sum%3==0&&sum%12==0)
        cout<<a<<b<<c<<d<<e<<f<<g<<h<<endl;
    }
}
 
 
int main()
{
    int year,day;
    for(int a=1;a<=2;a++)
    {
        for(int b=0;b<=9;b++)
        {
            for(int c=0;c<=9;c++)
            {
                for(int d=0;d<=9;d++)
                {
                    for(int e=0;e<=0;e++)
                    {
                        for(int f=6;f<=6;f++)
                        {
                            for(int g=0;g<=3;g++)
                            {
                                for(int h=0;h<=9;h++)
                                {
                                    judge(a,b,c,d,e,f,g,h);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

稍微优化一点点:(分别定义年月日)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int year,month,day;
    long int sum;
    for(year=1900;year<=2012;year++)
    {
        for(month=6;month<=6;month++)
        {
            for(day=1;day<=31;day++)
            {
                sum=year*10000+month*100+day;
                if(sum%2012==0&&sum%3==0&&sum%12==0)
                    printf("%d",sum);
            }
        }
    }
    return 0;
}
 

直接将年月日定义为一个数:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long int sum;
    for(sum=19000001;sum<=20120312;sum++)
    {
        if((sum%100)<=31&&(sum/100)%100==6&&sum%2012==0&&sum%3==0&&sum%12==0)
            printf("%d",sum);
    }
    return 0;
}
还有很多更有的方法,欢迎大家留言讨论。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值