|| 返回 || 本站首页 ||奥赛信息||计算机基础||pascal基础||数据结构||经典算法||试题汇编||校本教程||自主练习||

|| 自主练习>> 素数、万年历

双击自动滚屏 

   

素数

【问题】任给一个自然数n,求出这个自然数不同因数的个数。

        例如 n=6时,因为1,2,3,6这四个数均是6的因数,故输出为total=4。

【算法】类似判断素数的方法。

        如果发现n有一个≤sqr(n)的因数,必然同时有一个≥sqr(n)的因数。

        例如:6有一个因数2,则必有另一因数3。因为2*3=6

【参考程序】

       var n,nums,k,i:longint;

       begin

            repeat

              writeln('input n:');

              readln(n);

              if n<=0 then writeln('N>0!!');

            until n>0;

            k:=trunc(sqrt(n));

            nums:=2;

            for i:=2 to k do

               if  n mod i=0 then nums:=nums+2;

            if n=sqr(k) then dec(nums);

            writeln('nums:',nums);

       end.

 

万年历

【题目】输入年、月、日,求这一天是星期几。

【参考程序1】

【算法提要】求出这一天离公元1年的元旦有多少天days,然后对7求余

   const

        first=1;  {公元1年为基准}

        first_week=1;  {公元1年的元旦为星期一}

        yue:array[1..12] of 1..31=(31,28,31,30,31,30,31,31,30,31,30,31);

        week_:array[0..6] of string[20] =('Sunday','Monday','Tuesday','Wedsday',

                          'Thursday','Friday','Saturday');

   var

     days,week,year,month,date,i,years:longint;

   begin

        writeln('year:');readln(year);

        writeln('month');readln(month);

        writeln('date');readln(date);

        years:=0; days:=0;

        for i:=first to year-1 do

            if (i mod 400=0) or (i mod 4=0) and (i mod 100<>0) then

               begin years:=years+1;end;       {注意处理闰年的情况}

        days:=(year-first)*365+years;          {离基准年过了多少天}

        for i:=1 to month-1 do days:=days+yue[i];  {本年过了多少个月}

        for i:=1 to date do days:=days+1;          {本月过了多少天}

        if ((year mod 400=0) or (year mod 4=0) and (year mod 100<>0))

           and (month>3) then days:=days+1;     {如果本年为闰年,且月份超2月,

                                                        还要考虑加1}

 

        week:=((days-1) mod 7 +first_week ) mod 7;   {求星期数}

        writeln('it is ',week_[week]);

        readln;

   end.

 

【参考程序2】  用公式法: days:=trunc((year-1)*(1+1/4-1/100+1/400)+c)

                      用求出的days对7求余数。其中c为该天离该年元旦的天数

    const

         first=1;

         first_week=1;

         yue:array[1..12] of 1..31=(31,28,31,30,31,30,31,31,30,31,30,31);

         week_:array[0..6] of string[20] =('Sunday','Monday','Tuesday','Wedsday',

                           'Thursday','Friday','Saturday');

    var

         days,week,year,month,date,i:longint;

    begin

         writeln('year:');readln(year);

         writeln('month');readln(month);

         writeln('date');readln(date);

         days:=0;

         for i:=1 to month-1 do days:=days+yue[i];

         for i:=1 to date do days:=days+1;

         if ((year mod 400=0) or (year mod 4=0) and (year mod 100<>0))

            and (month>3) then days:=days+1;

         days:=trunc((year-1)*(1+1/4-1/100+1/400)+days);

         week:=days mod 7;

         writeln('it is ',week_[week]);

         readln;

    end.


 
 

 

 
 
 

制作与维护:重庆市忠县中学 谭海