欧拉计划问题十九matlab实现

Problem 19 :Counting Sundays

You are given the following information, but you may prefer to do some research for yourself.

  • 1 Jan 1900 was a Monday.
  • Thirty days has September,
    April, June and November.
    All the rest have thirty-one,
    Saving February alone,
    Which has twenty-eight, rain or shine.
    And on leap years, twenty-nine.
  • A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.

How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?

思路 :

这题就是让我们计算二十世纪中,每月一号是星期日的个数,据题意我们知道了一些条件,可是有一些附加条件需要我们去挖掘,比如我们是从1901年算到2000年,题目给出的是1900年1月1日是星期一,那我们需要计算一下1901年第一个星期日是几号,很显然这是一个循环,俗话说日复一日,年复一年,就是这个道理。

我得到这道题的思路就是从这里想到的,因为我们是从1901年开始,所以我先想到从1900年1月1日星期一算出1901年1月1日是星期几,因为一周是7天,而刚好1900年1月1日作为循环的起点,所以

                                                             365 / 7 = 52\cdot \cdot \cdot 1

即刚好1901年1月1日就是星期二,然后找到1901年第一个星期日是1月6号,作为计算起始点,然后把迭代

month123456789101112
First Sunday

6

33752741631
Two Sunday131010141291411813108
Three Sunday201717211916211815201715
Four Sunday272424282623282522272422
Five Sunday343131353330353229343129
         36  36

 

output3331-31+7=75274163136-31=5(下一年的)

表格没规划好,本来应该是8行,但我比较懒,不想重画了,凑合看看!

这其实就是一个不断迭代的过程。具体见代码:

代码 :

clear,clc;
tic
day = 6;
count = 0;
i = 1;
for year = 1901:2000
    if (mod(year,4)==0 && mod(year,100)~=0)|| (mod(year,400)==0)  %is leap yearear 
        Feb = 29;
    else
        Feb = 28;
    end
    month = [31,Feb,31,30,31,30,31,31,30,31,30,31]; %month matrix
    i = 1;
    while i < 13
        while day < month(i)
            day = day + 7;     %lteration---one cycle every seven days
        end
        while day >= month(i)
            day = day - month(i);
            break
        end
        if day == 1
            count = count + 1;
            %disp(year),disp(i+1),disp(day);               %set  the output format
            if i == 12
                formatSpec = ('%d/%d/%d.\n');
                fprintf(formatSpec,year+1,1,day);
            else
                formatSpec = ('%d/%d/%d.\n');            %set  the output format
                fprintf(formatSpec,year,i + 1,day);
            end
        end
        i = i + 1;
    end
end
count          %disp result
toc

代码运行起来还是非常高效的。(Elapsed time is 0.266348 seconds.)

结果 :171

补充:前两天有点忙,没来得及更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值