不可以直接echo XXX个
39 个解决方案
#1
for($i=1;$i<=2004;$i++)
if(date("L" , mktime(0,0,0,1,1,$i))
echo $i."是闰年";
未经测试:D
if(date("L" , mktime(0,0,0,1,1,$i))
echo $i."是闰年";
未经测试:D
#2
<?php
function sign($n) {
if($n == 0) return 0;
return abs($n)/$n;
}
function test($m,$n) {
$sum = 0;
for($y=$m;$y<=$n;$y++)
if(sign($y%4)-sign($y%100)+sign($y%400) == 0)
$sum++;
echo "从{$m}到{$n}共有{$sum}个闰年";
}
test(1900,2004);
?>
由于历法的变动,能否从1年算起需要证明
function sign($n) {
if($n == 0) return 0;
return abs($n)/$n;
}
function test($m,$n) {
$sum = 0;
for($y=$m;$y<=$n;$y++)
if(sign($y%4)-sign($y%100)+sign($y%400) == 0)
$sum++;
echo "从{$m}到{$n}共有{$sum}个闰年";
}
test(1900,2004);
?>
由于历法的变动,能否从1年算起需要证明
#3
嘿嘿shuzai被淘汰,1,循环2004次,效率不行,2,mktime有限制
the range of valid years includes only 1970 through 2038.
the range of valid years includes only 1970 through 2038.
#4
xuzuning(唠叨)也被淘汰,循环次数的问题
#5
对了,不考虑公元前,只考虑>0的年份。
不考虑历法的变动。
提示一下,用最少的循环,步进是100哦
不考虑历法的变动。
提示一下,用最少的循环,步进是100哦
#6
function leapyear($first,$last){
$years = $last-$first+1;
$num =intval($years/4);
$remain =$years%4;
$array[] =array(0,$first,$first+1,$first+2);
if(($array[$remain]%4 - $remain +1)<=0){
$num++;
}
return $num;
}
$years = $last-$first+1;
$num =intval($years/4);
$remain =$years%4;
$array[] =array(0,$first,$first+1,$first+2);
if(($array[$remain]%4 - $remain +1)<=0){
$num++;
}
return $num;
}
#7
不考虑历法变动,公元前后都可
#8
高手再帮改改
#9
yh801216(艾奥利斯) 你的算法错误。
#10
[]
去掉这个,赫赫
去掉这个,赫赫
#11
<?
function leapyear($first,$last){
if($last<$first){
$pp = $last;
$last = $first;
$first = $pp;
}
$years = $last-$first+1;
$num =intval($years/4);
$remain =$years%4;
$array =array(0,$first,$first+1,$first+2);
if(($array[$remain]%4 - $remain +1)<=0){
$num++;
}
return $num;
}
?>
function leapyear($first,$last){
if($last<$first){
$pp = $last;
$last = $first;
$first = $pp;
}
$years = $last-$first+1;
$num =intval($years/4);
$remain =$years%4;
$array =array(0,$first,$first+1,$first+2);
if(($array[$remain]%4 - $remain +1)<=0){
$num++;
}
return $num;
}
?>
#12
/**
* 函数名称: getleap
* 函数功能: 取得闰年数组
闰年条件
① 能被4整除,但不能被100整除
② 能被4整除,且能被400整除
* 输入参数:
$start ------------- 起始年份
$end --------------- 结束年份
* 函数返回值: array
* 其它说明: 说明
*/
function getleap($start,$end)
{
$arr = array();
for($i=$start; $i<=$end; $i++)
{
if($i%400==0||($i%4==0&&$i%100!=0))
{
$arr[] = $i;
}
}
Return $arr;
}
$aget = getleap(4,2004);
print_r($aget);
* 函数名称: getleap
* 函数功能: 取得闰年数组
闰年条件
① 能被4整除,但不能被100整除
② 能被4整除,且能被400整除
* 输入参数:
$start ------------- 起始年份
$end --------------- 结束年份
* 函数返回值: array
* 其它说明: 说明
*/
function getleap($start,$end)
{
$arr = array();
for($i=$start; $i<=$end; $i++)
{
if($i%400==0||($i%4==0&&$i%100!=0))
{
$arr[] = $i;
}
}
Return $arr;
}
$aget = getleap(4,2004);
print_r($aget);
#13
偶然兄也来啦?
你这个好像也循环了$end-$start+1次啊
你这个好像也循环了$end-$start+1次啊
#14
顶顶看
#15
代码不写了,写个自然语言描述的伪代码吧~~~
function getleap($start, $end)
{
计算 $start 距它前一个润年有几年(3>= 结果1 >=0)
计算 $end 距它前一个润年有几年(3>= 结果2 >=0)
getleap = $start - $end + 结果1 - 结果2 + 1
}
计算某年距它前一个润年有几年很简单吧?除出来的余数合适就合适~~~~
function getleap($start, $end)
{
计算 $start 距它前一个润年有几年(3>= 结果1 >=0)
计算 $end 距它前一个润年有几年(3>= 结果2 >=0)
getleap = $start - $end + 结果1 - 结果2 + 1
}
计算某年距它前一个润年有几年很简单吧?除出来的余数合适就合适~~~~
#16
高手们较量啊!
#17
mikespook(谁说叫Mike的一定是狼?) 也不对啊,没考虑100和400
1800年和1900年不是闰年,2000年是闰年
1800年和1900年不是闰年,2000年是闰年
#18
其实知道有多少个闰年就可以计算任何两个年份日期之间有多少天,任何两个时刻之间有多少小时多少秒,呵呵,抛砖引玉
#19
还可以算今天以前1万天是哪年哪月哪日。
#20
恩,的确~~~
忽忽,不过你的算法确实更好~~~
计算两年之间有多少天,然后去除365~~~
忽忽,不过你的算法确实更好~~~
计算两年之间有多少天,然后去除365~~~
#21
晕,大大们,问题被你们搞复杂了。。。不要那么精确的话(比如年份差不能超过10000年或者1000000年)
去差地球公转周期!~那样再来个近似判断。只要你取的精确度够高就一切ok!~
没必要那么延伸吧。。。。。小时,秒就免了。没必要算了。。。。。
还要补充一句:(555,我怎么那么白痴,竟然不知道闰年是怎么回事。。。555)
去差地球公转周期!~那样再来个近似判断。只要你取的精确度够高就一切ok!~
没必要那么延伸吧。。。。。小时,秒就免了。没必要算了。。。。。
还要补充一句:(555,我怎么那么白痴,竟然不知道闰年是怎么回事。。。555)
#22
比较实际的问题就是今天到北京奥运会还有几天几秒,你不得不算闰年吧?
当然年份相差不会太大,例如*诞辰多少天了,这都是比较实际的问题
当然年份相差不会太大,例如*诞辰多少天了,这都是比较实际的问题
#23
在时间戳之内的可以用时间戳来算,但是1970年以前的就得想别的算法了
#24
简化问题:2数间能被4整除得数有多少个?
问题分析:
1 结果判断:2中结果:intval($y%4)和intval($y%4)+1。
2 状况分类判断:2类:(1)$y%4=0,结果唯一intval($y%4)
(2)$y%4!=0,结果不定
3 讨论(2):利用结论(1)截除情况(2)的数列,剩余元素个数为1-3个。
情况分析,归纳:看剩余这几个元素有无能被4整除得数。
归纳得判断公式--($array[$remain]%4-$remain +1)<=0?
4继续归纳:考虑$y%4=0情形,得出共性。就得出上述方法了:)
至于真正的闰年算法,赫赫,想想办法补上吧。(俺太懒。。。)
问题分析:
1 结果判断:2中结果:intval($y%4)和intval($y%4)+1。
2 状况分类判断:2类:(1)$y%4=0,结果唯一intval($y%4)
(2)$y%4!=0,结果不定
3 讨论(2):利用结论(1)截除情况(2)的数列,剩余元素个数为1-3个。
情况分析,归纳:看剩余这几个元素有无能被4整除得数。
归纳得判断公式--($array[$remain]%4-$remain +1)<=0?
4继续归纳:考虑$y%4=0情形,得出共性。就得出上述方法了:)
至于真正的闰年算法,赫赫,想想办法补上吧。(俺太懒。。。)
#25
嗯。不好意思,我那样用地球公转周期分段更麻烦。。。。赫赫
#26
判断两数之间有多少个能被4整除的不用循环
$y=100;
$x=1;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($y%4?$n+0:$n+1):$n+0;
echo $n;
四个连续的整数之中必定有且只有一个4的整数
然后再判断最后一个数是不是4的整数
$y=100;
$x=1;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($y%4?$n+0:$n+1):$n+0;
echo $n;
四个连续的整数之中必定有且只有一个4的整数
然后再判断最后一个数是不是4的整数
#27
高!
#28
象这样的衣服,我都不敢穿
#29
ashchen(陈辉) :
你的错了,如果是x=4,y=9呢?
有看我的么?我好像没有用循环吧?赫赫
另外,求闰年时,考虑一下,是套用我那种方法好,还是你们的循环好,那种好就用那种3。
目前你们写得好象计算量都很大。跟年限差关系很大哦。。。
用循环遍历是最好不要采用的办法
再加个参数$n就可以求被$n整除得个数了。。。。。。
还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量???
你的错了,如果是x=4,y=9呢?
有看我的么?我好像没有用循环吧?赫赫
另外,求闰年时,考虑一下,是套用我那种方法好,还是你们的循环好,那种好就用那种3。
目前你们写得好象计算量都很大。跟年限差关系很大哦。。。
用循环遍历是最好不要采用的办法
再加个参数$n就可以求被$n整除得个数了。。。。。。
还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量???
#30
可惜的是楼主把事情弄错了
太阳历和公历
--------------------------------------------------------------------------------
现在世界上通用的历法——公历,有人曾似是而非地称之为“西历”。其实,究其根
源,这种历法并非产生于西方,而是产生于6000多年前的古埃及。
古埃及气候炎热,雨水稀少,但是农业生产却很发达。这是为什么呢?原来这与尼罗河
的定期泛滥有着密切的关系。埃及的大部分国土都是沙漠,只有尼罗河流域像一条绿色的缎
带从南到北贯穿其间。直到现代,埃及的的95%以上的人口也都集中在这条绿色的生命带
中。因此,在希腊时代,西方人便把埃及称为“尼罗河送来的礼物”。古代埃及人更是将尼
罗河视为“母亲河”。
尼罗河全长6648公里,同亚洲的长江、南美洲的亚马逊河和北美洲的密西西比河并
称为世界最长的河流。
尼罗河发源于赤道一带,主流叫白尼罗河,从乌干达流入苏丹,在喀土穆和发源于埃塞
俄比亚的青尼罗河汇合,流入埃及。
在埃及境内,尼罗河每年6月开始涨水,7至10月是泛滥期,这时洪水夹带着大量腐
殖质,灌满了两岸龟裂的农田。几个星期后,当洪水退去时,农田就留下了一层肥沃的淤
泥,等于上了一次肥。11月进行播种,第二年的3至4月收获。尼罗河还有一个特性,那
就是每年的涨水基本是定时定量,虽有一定的出入,但差别不是太大,从没有洪水滔天淹没
一切的大灾。这就为古埃及人最早创建大规模的水利灌溉系统和制定历法提供了方便。
古埃及人为了不违农时,发展农业生产,逐渐认识到必须掌握尼罗河泛滥的规律,准确
地计算时间,这就需要有一种历法。他们在长期的生产实践中,积累了许多经验。
古埃及人发现尼罗河每次泛滥之间大约相隔365天。同时,他们还发现,每年6月的
某一天早晨,当尼罗河的潮头来到今天开罗附近时,天狼星与太阳同时从地平线升起。以此
为根据,古埃及人便把一年定为365天,把天狼星与太阳同时从地平线升起的那一天,定
为一年的起点。一年分为12个月,每月30天,年终加5天作为节日,这就是埃及的太阳
历。
埃及的太阳历将一年定为365天,与地球围绕太阳公转一圈的时间(回归年)相比
较,只相差四分之一天,这在当时已经是相当准确了。但是,一年相差四分之一天不觉得,
经过4年就相差一天。经过730年,历法上的时间就比实际时间推进了半年,冬天和夏天
正好颠倒过来。再过730年,才能回到原来的起点。公元前46年,罗马统帅儒略·凯撒
(又译朱利乌斯·凯撒)决定以埃及的太阳历为蓝本,重新编制历法。凯撒主持编制的历
法,被后人称为“儒略历”。
儒略历法对埃及太阳历中每年约四分之一天的误差,作了这样的调整:设平年和闰年,
平年365天,闰年366天。每4年置1个闰年。单月每月31天,双月中的2月平年2
9天,闰年30天,其它双月每月30天。
恺撒死后,他的继承人奥古斯都因为自己生在8月,便从2月中抽出一天加在8月上,
使8月也成为大月,即31天,同时相应把9、11两个月定为小月,10、12两个月定
为大月。经过这样的改动,各月的天数与今天使用的公历基本相同了。公元325年,罗马
皇帝君士坦丁在一次宗教会议上,规定儒略历为基督教的历法,但没有规定哪一年是它的起
点。到了公元6世纪时,基督教徒把500多年前基督教传说的创始人耶稣·基督诞生的那
一天,说成是公元元年。“公元”的拉丁文的意思就是“主的生年”,用拉丁文A.D.表
示。在这一年以前,称为“公元前”,英文的意思是“基督以前”,用英文B.C.表示。
儒略历虽然比埃及的太阳历进了一步,但回归年仍有11分14秒的误差,积128年
又要相差一天。儒略历在欧洲通行了1600多年,至16世纪下半叶,历法上的日期比回
归年迟了10天。比如,1583年的春分应在3月21日,历法上却是3月11日。此
外,教会规定耶稣复活节,应在过春分月圆后的第一个星期日,由于春分已相差10天之
多,耶稣究竟在哪一天“复活”的,也成了问题。因此,对儒略历作进一步的改革,已经势
在必行。
罗马教皇格里高利十三世,在1582年组织了一批天文学家,根据哥白尼日心说计算
出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤
销,继10月4日之后为10月15日,所以1533年的春分又复归于3月21日;过去
将4年置1个闰年,400年共计100个闰年,现在改为400年中有97个闰年,从而
大体上弥补了11分14秒的误差。置闰的方法是:凡是逢百年那一年可以用400除尽的
就是闰年,除不尽的就不是(如:1600年是年,1700年、1800年、1900年
皆不是年,2000年是闰年)。后来人们将这一新的历法称为“格里高利历”,也就是今
天世界上所通用的历法,简称格里历或公历。
*成立后,*人民*通令,中国以格里历为国家历法,并采用公元纪
年,但不废除农历。
当然,格里历也不是尽善尽美的,每月的天数仍然参差不齐,规则性不强,特别是每经
过三千几百年还会有一天的误差。随着生产的发展和天文学的进步,这些缺陷将不断得到改
进。
太阳历和公历
--------------------------------------------------------------------------------
现在世界上通用的历法——公历,有人曾似是而非地称之为“西历”。其实,究其根
源,这种历法并非产生于西方,而是产生于6000多年前的古埃及。
古埃及气候炎热,雨水稀少,但是农业生产却很发达。这是为什么呢?原来这与尼罗河
的定期泛滥有着密切的关系。埃及的大部分国土都是沙漠,只有尼罗河流域像一条绿色的缎
带从南到北贯穿其间。直到现代,埃及的的95%以上的人口也都集中在这条绿色的生命带
中。因此,在希腊时代,西方人便把埃及称为“尼罗河送来的礼物”。古代埃及人更是将尼
罗河视为“母亲河”。
尼罗河全长6648公里,同亚洲的长江、南美洲的亚马逊河和北美洲的密西西比河并
称为世界最长的河流。
尼罗河发源于赤道一带,主流叫白尼罗河,从乌干达流入苏丹,在喀土穆和发源于埃塞
俄比亚的青尼罗河汇合,流入埃及。
在埃及境内,尼罗河每年6月开始涨水,7至10月是泛滥期,这时洪水夹带着大量腐
殖质,灌满了两岸龟裂的农田。几个星期后,当洪水退去时,农田就留下了一层肥沃的淤
泥,等于上了一次肥。11月进行播种,第二年的3至4月收获。尼罗河还有一个特性,那
就是每年的涨水基本是定时定量,虽有一定的出入,但差别不是太大,从没有洪水滔天淹没
一切的大灾。这就为古埃及人最早创建大规模的水利灌溉系统和制定历法提供了方便。
古埃及人为了不违农时,发展农业生产,逐渐认识到必须掌握尼罗河泛滥的规律,准确
地计算时间,这就需要有一种历法。他们在长期的生产实践中,积累了许多经验。
古埃及人发现尼罗河每次泛滥之间大约相隔365天。同时,他们还发现,每年6月的
某一天早晨,当尼罗河的潮头来到今天开罗附近时,天狼星与太阳同时从地平线升起。以此
为根据,古埃及人便把一年定为365天,把天狼星与太阳同时从地平线升起的那一天,定
为一年的起点。一年分为12个月,每月30天,年终加5天作为节日,这就是埃及的太阳
历。
埃及的太阳历将一年定为365天,与地球围绕太阳公转一圈的时间(回归年)相比
较,只相差四分之一天,这在当时已经是相当准确了。但是,一年相差四分之一天不觉得,
经过4年就相差一天。经过730年,历法上的时间就比实际时间推进了半年,冬天和夏天
正好颠倒过来。再过730年,才能回到原来的起点。公元前46年,罗马统帅儒略·凯撒
(又译朱利乌斯·凯撒)决定以埃及的太阳历为蓝本,重新编制历法。凯撒主持编制的历
法,被后人称为“儒略历”。
儒略历法对埃及太阳历中每年约四分之一天的误差,作了这样的调整:设平年和闰年,
平年365天,闰年366天。每4年置1个闰年。单月每月31天,双月中的2月平年2
9天,闰年30天,其它双月每月30天。
恺撒死后,他的继承人奥古斯都因为自己生在8月,便从2月中抽出一天加在8月上,
使8月也成为大月,即31天,同时相应把9、11两个月定为小月,10、12两个月定
为大月。经过这样的改动,各月的天数与今天使用的公历基本相同了。公元325年,罗马
皇帝君士坦丁在一次宗教会议上,规定儒略历为基督教的历法,但没有规定哪一年是它的起
点。到了公元6世纪时,基督教徒把500多年前基督教传说的创始人耶稣·基督诞生的那
一天,说成是公元元年。“公元”的拉丁文的意思就是“主的生年”,用拉丁文A.D.表
示。在这一年以前,称为“公元前”,英文的意思是“基督以前”,用英文B.C.表示。
儒略历虽然比埃及的太阳历进了一步,但回归年仍有11分14秒的误差,积128年
又要相差一天。儒略历在欧洲通行了1600多年,至16世纪下半叶,历法上的日期比回
归年迟了10天。比如,1583年的春分应在3月21日,历法上却是3月11日。此
外,教会规定耶稣复活节,应在过春分月圆后的第一个星期日,由于春分已相差10天之
多,耶稣究竟在哪一天“复活”的,也成了问题。因此,对儒略历作进一步的改革,已经势
在必行。
罗马教皇格里高利十三世,在1582年组织了一批天文学家,根据哥白尼日心说计算
出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤
销,继10月4日之后为10月15日,所以1533年的春分又复归于3月21日;过去
将4年置1个闰年,400年共计100个闰年,现在改为400年中有97个闰年,从而
大体上弥补了11分14秒的误差。置闰的方法是:凡是逢百年那一年可以用400除尽的
就是闰年,除不尽的就不是(如:1600年是年,1700年、1800年、1900年
皆不是年,2000年是闰年)。后来人们将这一新的历法称为“格里高利历”,也就是今
天世界上所通用的历法,简称格里历或公历。
*成立后,*人民*通令,中国以格里历为国家历法,并采用公元纪
年,但不废除农历。
当然,格里历也不是尽善尽美的,每月的天数仍然参差不齐,规则性不强,特别是每经
过三千几百年还会有一天的误差。随着生产的发展和天文学的进步,这些缺陷将不断得到改
进。
#31
上面的确错了,下面是正确的,($t%4>$y%4?$n+1:$n+0)这个比较巧妙,只要总数取4的模大于最后一个数取4的模肯定 能被4整除。
$y=9;$x=4;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($t%4>$y%4?$n+1:$n+0):$n+0;
echo $n;
写成函数就是
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
$n=$t%$j?($t%$j>$y%$j?$n+1:$n+0):$n+0;
return $n;}
都验证一下看对不对
$y=9;$x=4;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($t%4>$y%4?$n+1:$n+0):$n+0;
echo $n;
写成函数就是
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
$n=$t%$j?($t%$j>$y%$j?$n+1:$n+0):$n+0;
return $n;}
都验证一下看对不对
#32
$x=1900;
$y=2004;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($t%4>$y%4?$n+1:$n+0):$n+0;
echo $n;
结果为27
按闰年的约定,1900-2004间只有26个
你把1900也算作闰年了
$y=2004;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($t%4>$y%4?$n+1:$n+0):$n+0;
echo $n;
结果为27
按闰年的约定,1900-2004间只有26个
你把1900也算作闰年了
#33
那个只是能被4整除的算法,下面是应该是最简单最搞笑计算闰年方法
$x=1;$y=1004;
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
$n=$t%$j?($t%$j>$y%$j?$n+1:$n+0):$n+0;
return $n;}
echo fun($x,$y,4)-fun($x,$y,100)+fun($x,$y,400);
$x=1;$y=1004;
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
$n=$t%$j?($t%$j>$y%$j?$n+1:$n+0):$n+0;
return $n;}
echo fun($x,$y,4)-fun($x,$y,100)+fun($x,$y,400);
#34
正确结果是486,好老的电脑
#35
上面那个运行时间:8.9000000000006E-005486秒
xuzuning(唠叨) 的运行时间是:0.015689秒
至于质数的算法,实在想不出更好好的。
不过能被4整除的肯定能被2整除
xuzuning(唠叨) 的运行时间是:0.015689秒
至于质数的算法,实在想不出更好好的。
不过能被4整除的肯定能被2整除
#36
ashchen(陈辉) :
嗯。你那个是很不错。要是我的的话就只能是(4-$first%4)%4<$years%4...555555555555
赫赫。归纳的彻底。赫赫。
xuzuning(唠叨) :大大不好意思哈,俺跑题了。讨论简化问题去了。
还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量???
嗯。你那个是很不错。要是我的的话就只能是(4-$first%4)%4<$years%4...555555555555
赫赫。归纳的彻底。赫赫。
xuzuning(唠叨) :大大不好意思哈,俺跑题了。讨论简化问题去了。
还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量???
#37
函数再简化一下,估计可以写到标准函数库里了,绝对高效率
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
if($t%$j && $t%$j>$y%$j) $n++;
return $n;}
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
if($t%$j && $t%$j>$y%$j) $n++;
return $n;}
#38
模2、模3、模5、模7、模11....
以2起步长为2构造n以内的素数表
2-n内的数查表
以2起步长为2构造n以内的素数表
2-n内的数查表
#39
xuzuning(唠叨) :
一次循环???
老大给具体讲讲吧
一次循环???
老大给具体讲讲吧
#1
for($i=1;$i<=2004;$i++)
if(date("L" , mktime(0,0,0,1,1,$i))
echo $i."是闰年";
未经测试:D
if(date("L" , mktime(0,0,0,1,1,$i))
echo $i."是闰年";
未经测试:D
#2
<?php
function sign($n) {
if($n == 0) return 0;
return abs($n)/$n;
}
function test($m,$n) {
$sum = 0;
for($y=$m;$y<=$n;$y++)
if(sign($y%4)-sign($y%100)+sign($y%400) == 0)
$sum++;
echo "从{$m}到{$n}共有{$sum}个闰年";
}
test(1900,2004);
?>
由于历法的变动,能否从1年算起需要证明
function sign($n) {
if($n == 0) return 0;
return abs($n)/$n;
}
function test($m,$n) {
$sum = 0;
for($y=$m;$y<=$n;$y++)
if(sign($y%4)-sign($y%100)+sign($y%400) == 0)
$sum++;
echo "从{$m}到{$n}共有{$sum}个闰年";
}
test(1900,2004);
?>
由于历法的变动,能否从1年算起需要证明
#3
嘿嘿shuzai被淘汰,1,循环2004次,效率不行,2,mktime有限制
the range of valid years includes only 1970 through 2038.
the range of valid years includes only 1970 through 2038.
#4
xuzuning(唠叨)也被淘汰,循环次数的问题
#5
对了,不考虑公元前,只考虑>0的年份。
不考虑历法的变动。
提示一下,用最少的循环,步进是100哦
不考虑历法的变动。
提示一下,用最少的循环,步进是100哦
#6
function leapyear($first,$last){
$years = $last-$first+1;
$num =intval($years/4);
$remain =$years%4;
$array[] =array(0,$first,$first+1,$first+2);
if(($array[$remain]%4 - $remain +1)<=0){
$num++;
}
return $num;
}
$years = $last-$first+1;
$num =intval($years/4);
$remain =$years%4;
$array[] =array(0,$first,$first+1,$first+2);
if(($array[$remain]%4 - $remain +1)<=0){
$num++;
}
return $num;
}
#7
不考虑历法变动,公元前后都可
#8
高手再帮改改
#9
yh801216(艾奥利斯) 你的算法错误。
#10
[]
去掉这个,赫赫
去掉这个,赫赫
#11
<?
function leapyear($first,$last){
if($last<$first){
$pp = $last;
$last = $first;
$first = $pp;
}
$years = $last-$first+1;
$num =intval($years/4);
$remain =$years%4;
$array =array(0,$first,$first+1,$first+2);
if(($array[$remain]%4 - $remain +1)<=0){
$num++;
}
return $num;
}
?>
function leapyear($first,$last){
if($last<$first){
$pp = $last;
$last = $first;
$first = $pp;
}
$years = $last-$first+1;
$num =intval($years/4);
$remain =$years%4;
$array =array(0,$first,$first+1,$first+2);
if(($array[$remain]%4 - $remain +1)<=0){
$num++;
}
return $num;
}
?>
#12
/**
* 函数名称: getleap
* 函数功能: 取得闰年数组
闰年条件
① 能被4整除,但不能被100整除
② 能被4整除,且能被400整除
* 输入参数:
$start ------------- 起始年份
$end --------------- 结束年份
* 函数返回值: array
* 其它说明: 说明
*/
function getleap($start,$end)
{
$arr = array();
for($i=$start; $i<=$end; $i++)
{
if($i%400==0||($i%4==0&&$i%100!=0))
{
$arr[] = $i;
}
}
Return $arr;
}
$aget = getleap(4,2004);
print_r($aget);
* 函数名称: getleap
* 函数功能: 取得闰年数组
闰年条件
① 能被4整除,但不能被100整除
② 能被4整除,且能被400整除
* 输入参数:
$start ------------- 起始年份
$end --------------- 结束年份
* 函数返回值: array
* 其它说明: 说明
*/
function getleap($start,$end)
{
$arr = array();
for($i=$start; $i<=$end; $i++)
{
if($i%400==0||($i%4==0&&$i%100!=0))
{
$arr[] = $i;
}
}
Return $arr;
}
$aget = getleap(4,2004);
print_r($aget);
#13
偶然兄也来啦?
你这个好像也循环了$end-$start+1次啊
你这个好像也循环了$end-$start+1次啊
#14
顶顶看
#15
代码不写了,写个自然语言描述的伪代码吧~~~
function getleap($start, $end)
{
计算 $start 距它前一个润年有几年(3>= 结果1 >=0)
计算 $end 距它前一个润年有几年(3>= 结果2 >=0)
getleap = $start - $end + 结果1 - 结果2 + 1
}
计算某年距它前一个润年有几年很简单吧?除出来的余数合适就合适~~~~
function getleap($start, $end)
{
计算 $start 距它前一个润年有几年(3>= 结果1 >=0)
计算 $end 距它前一个润年有几年(3>= 结果2 >=0)
getleap = $start - $end + 结果1 - 结果2 + 1
}
计算某年距它前一个润年有几年很简单吧?除出来的余数合适就合适~~~~
#16
高手们较量啊!
#17
mikespook(谁说叫Mike的一定是狼?) 也不对啊,没考虑100和400
1800年和1900年不是闰年,2000年是闰年
1800年和1900年不是闰年,2000年是闰年
#18
其实知道有多少个闰年就可以计算任何两个年份日期之间有多少天,任何两个时刻之间有多少小时多少秒,呵呵,抛砖引玉
#19
还可以算今天以前1万天是哪年哪月哪日。
#20
恩,的确~~~
忽忽,不过你的算法确实更好~~~
计算两年之间有多少天,然后去除365~~~
忽忽,不过你的算法确实更好~~~
计算两年之间有多少天,然后去除365~~~
#21
晕,大大们,问题被你们搞复杂了。。。不要那么精确的话(比如年份差不能超过10000年或者1000000年)
去差地球公转周期!~那样再来个近似判断。只要你取的精确度够高就一切ok!~
没必要那么延伸吧。。。。。小时,秒就免了。没必要算了。。。。。
还要补充一句:(555,我怎么那么白痴,竟然不知道闰年是怎么回事。。。555)
去差地球公转周期!~那样再来个近似判断。只要你取的精确度够高就一切ok!~
没必要那么延伸吧。。。。。小时,秒就免了。没必要算了。。。。。
还要补充一句:(555,我怎么那么白痴,竟然不知道闰年是怎么回事。。。555)
#22
比较实际的问题就是今天到北京奥运会还有几天几秒,你不得不算闰年吧?
当然年份相差不会太大,例如*诞辰多少天了,这都是比较实际的问题
当然年份相差不会太大,例如*诞辰多少天了,这都是比较实际的问题
#23
在时间戳之内的可以用时间戳来算,但是1970年以前的就得想别的算法了
#24
简化问题:2数间能被4整除得数有多少个?
问题分析:
1 结果判断:2中结果:intval($y%4)和intval($y%4)+1。
2 状况分类判断:2类:(1)$y%4=0,结果唯一intval($y%4)
(2)$y%4!=0,结果不定
3 讨论(2):利用结论(1)截除情况(2)的数列,剩余元素个数为1-3个。
情况分析,归纳:看剩余这几个元素有无能被4整除得数。
归纳得判断公式--($array[$remain]%4-$remain +1)<=0?
4继续归纳:考虑$y%4=0情形,得出共性。就得出上述方法了:)
至于真正的闰年算法,赫赫,想想办法补上吧。(俺太懒。。。)
问题分析:
1 结果判断:2中结果:intval($y%4)和intval($y%4)+1。
2 状况分类判断:2类:(1)$y%4=0,结果唯一intval($y%4)
(2)$y%4!=0,结果不定
3 讨论(2):利用结论(1)截除情况(2)的数列,剩余元素个数为1-3个。
情况分析,归纳:看剩余这几个元素有无能被4整除得数。
归纳得判断公式--($array[$remain]%4-$remain +1)<=0?
4继续归纳:考虑$y%4=0情形,得出共性。就得出上述方法了:)
至于真正的闰年算法,赫赫,想想办法补上吧。(俺太懒。。。)
#25
嗯。不好意思,我那样用地球公转周期分段更麻烦。。。。赫赫
#26
判断两数之间有多少个能被4整除的不用循环
$y=100;
$x=1;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($y%4?$n+0:$n+1):$n+0;
echo $n;
四个连续的整数之中必定有且只有一个4的整数
然后再判断最后一个数是不是4的整数
$y=100;
$x=1;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($y%4?$n+0:$n+1):$n+0;
echo $n;
四个连续的整数之中必定有且只有一个4的整数
然后再判断最后一个数是不是4的整数
#27
高!
#28
象这样的衣服,我都不敢穿
#29
ashchen(陈辉) :
你的错了,如果是x=4,y=9呢?
有看我的么?我好像没有用循环吧?赫赫
另外,求闰年时,考虑一下,是套用我那种方法好,还是你们的循环好,那种好就用那种3。
目前你们写得好象计算量都很大。跟年限差关系很大哦。。。
用循环遍历是最好不要采用的办法
再加个参数$n就可以求被$n整除得个数了。。。。。。
还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量???
你的错了,如果是x=4,y=9呢?
有看我的么?我好像没有用循环吧?赫赫
另外,求闰年时,考虑一下,是套用我那种方法好,还是你们的循环好,那种好就用那种3。
目前你们写得好象计算量都很大。跟年限差关系很大哦。。。
用循环遍历是最好不要采用的办法
再加个参数$n就可以求被$n整除得个数了。。。。。。
还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量???
#30
可惜的是楼主把事情弄错了
太阳历和公历
--------------------------------------------------------------------------------
现在世界上通用的历法——公历,有人曾似是而非地称之为“西历”。其实,究其根
源,这种历法并非产生于西方,而是产生于6000多年前的古埃及。
古埃及气候炎热,雨水稀少,但是农业生产却很发达。这是为什么呢?原来这与尼罗河
的定期泛滥有着密切的关系。埃及的大部分国土都是沙漠,只有尼罗河流域像一条绿色的缎
带从南到北贯穿其间。直到现代,埃及的的95%以上的人口也都集中在这条绿色的生命带
中。因此,在希腊时代,西方人便把埃及称为“尼罗河送来的礼物”。古代埃及人更是将尼
罗河视为“母亲河”。
尼罗河全长6648公里,同亚洲的长江、南美洲的亚马逊河和北美洲的密西西比河并
称为世界最长的河流。
尼罗河发源于赤道一带,主流叫白尼罗河,从乌干达流入苏丹,在喀土穆和发源于埃塞
俄比亚的青尼罗河汇合,流入埃及。
在埃及境内,尼罗河每年6月开始涨水,7至10月是泛滥期,这时洪水夹带着大量腐
殖质,灌满了两岸龟裂的农田。几个星期后,当洪水退去时,农田就留下了一层肥沃的淤
泥,等于上了一次肥。11月进行播种,第二年的3至4月收获。尼罗河还有一个特性,那
就是每年的涨水基本是定时定量,虽有一定的出入,但差别不是太大,从没有洪水滔天淹没
一切的大灾。这就为古埃及人最早创建大规模的水利灌溉系统和制定历法提供了方便。
古埃及人为了不违农时,发展农业生产,逐渐认识到必须掌握尼罗河泛滥的规律,准确
地计算时间,这就需要有一种历法。他们在长期的生产实践中,积累了许多经验。
古埃及人发现尼罗河每次泛滥之间大约相隔365天。同时,他们还发现,每年6月的
某一天早晨,当尼罗河的潮头来到今天开罗附近时,天狼星与太阳同时从地平线升起。以此
为根据,古埃及人便把一年定为365天,把天狼星与太阳同时从地平线升起的那一天,定
为一年的起点。一年分为12个月,每月30天,年终加5天作为节日,这就是埃及的太阳
历。
埃及的太阳历将一年定为365天,与地球围绕太阳公转一圈的时间(回归年)相比
较,只相差四分之一天,这在当时已经是相当准确了。但是,一年相差四分之一天不觉得,
经过4年就相差一天。经过730年,历法上的时间就比实际时间推进了半年,冬天和夏天
正好颠倒过来。再过730年,才能回到原来的起点。公元前46年,罗马统帅儒略·凯撒
(又译朱利乌斯·凯撒)决定以埃及的太阳历为蓝本,重新编制历法。凯撒主持编制的历
法,被后人称为“儒略历”。
儒略历法对埃及太阳历中每年约四分之一天的误差,作了这样的调整:设平年和闰年,
平年365天,闰年366天。每4年置1个闰年。单月每月31天,双月中的2月平年2
9天,闰年30天,其它双月每月30天。
恺撒死后,他的继承人奥古斯都因为自己生在8月,便从2月中抽出一天加在8月上,
使8月也成为大月,即31天,同时相应把9、11两个月定为小月,10、12两个月定
为大月。经过这样的改动,各月的天数与今天使用的公历基本相同了。公元325年,罗马
皇帝君士坦丁在一次宗教会议上,规定儒略历为基督教的历法,但没有规定哪一年是它的起
点。到了公元6世纪时,基督教徒把500多年前基督教传说的创始人耶稣·基督诞生的那
一天,说成是公元元年。“公元”的拉丁文的意思就是“主的生年”,用拉丁文A.D.表
示。在这一年以前,称为“公元前”,英文的意思是“基督以前”,用英文B.C.表示。
儒略历虽然比埃及的太阳历进了一步,但回归年仍有11分14秒的误差,积128年
又要相差一天。儒略历在欧洲通行了1600多年,至16世纪下半叶,历法上的日期比回
归年迟了10天。比如,1583年的春分应在3月21日,历法上却是3月11日。此
外,教会规定耶稣复活节,应在过春分月圆后的第一个星期日,由于春分已相差10天之
多,耶稣究竟在哪一天“复活”的,也成了问题。因此,对儒略历作进一步的改革,已经势
在必行。
罗马教皇格里高利十三世,在1582年组织了一批天文学家,根据哥白尼日心说计算
出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤
销,继10月4日之后为10月15日,所以1533年的春分又复归于3月21日;过去
将4年置1个闰年,400年共计100个闰年,现在改为400年中有97个闰年,从而
大体上弥补了11分14秒的误差。置闰的方法是:凡是逢百年那一年可以用400除尽的
就是闰年,除不尽的就不是(如:1600年是年,1700年、1800年、1900年
皆不是年,2000年是闰年)。后来人们将这一新的历法称为“格里高利历”,也就是今
天世界上所通用的历法,简称格里历或公历。
*成立后,*人民*通令,中国以格里历为国家历法,并采用公元纪
年,但不废除农历。
当然,格里历也不是尽善尽美的,每月的天数仍然参差不齐,规则性不强,特别是每经
过三千几百年还会有一天的误差。随着生产的发展和天文学的进步,这些缺陷将不断得到改
进。
太阳历和公历
--------------------------------------------------------------------------------
现在世界上通用的历法——公历,有人曾似是而非地称之为“西历”。其实,究其根
源,这种历法并非产生于西方,而是产生于6000多年前的古埃及。
古埃及气候炎热,雨水稀少,但是农业生产却很发达。这是为什么呢?原来这与尼罗河
的定期泛滥有着密切的关系。埃及的大部分国土都是沙漠,只有尼罗河流域像一条绿色的缎
带从南到北贯穿其间。直到现代,埃及的的95%以上的人口也都集中在这条绿色的生命带
中。因此,在希腊时代,西方人便把埃及称为“尼罗河送来的礼物”。古代埃及人更是将尼
罗河视为“母亲河”。
尼罗河全长6648公里,同亚洲的长江、南美洲的亚马逊河和北美洲的密西西比河并
称为世界最长的河流。
尼罗河发源于赤道一带,主流叫白尼罗河,从乌干达流入苏丹,在喀土穆和发源于埃塞
俄比亚的青尼罗河汇合,流入埃及。
在埃及境内,尼罗河每年6月开始涨水,7至10月是泛滥期,这时洪水夹带着大量腐
殖质,灌满了两岸龟裂的农田。几个星期后,当洪水退去时,农田就留下了一层肥沃的淤
泥,等于上了一次肥。11月进行播种,第二年的3至4月收获。尼罗河还有一个特性,那
就是每年的涨水基本是定时定量,虽有一定的出入,但差别不是太大,从没有洪水滔天淹没
一切的大灾。这就为古埃及人最早创建大规模的水利灌溉系统和制定历法提供了方便。
古埃及人为了不违农时,发展农业生产,逐渐认识到必须掌握尼罗河泛滥的规律,准确
地计算时间,这就需要有一种历法。他们在长期的生产实践中,积累了许多经验。
古埃及人发现尼罗河每次泛滥之间大约相隔365天。同时,他们还发现,每年6月的
某一天早晨,当尼罗河的潮头来到今天开罗附近时,天狼星与太阳同时从地平线升起。以此
为根据,古埃及人便把一年定为365天,把天狼星与太阳同时从地平线升起的那一天,定
为一年的起点。一年分为12个月,每月30天,年终加5天作为节日,这就是埃及的太阳
历。
埃及的太阳历将一年定为365天,与地球围绕太阳公转一圈的时间(回归年)相比
较,只相差四分之一天,这在当时已经是相当准确了。但是,一年相差四分之一天不觉得,
经过4年就相差一天。经过730年,历法上的时间就比实际时间推进了半年,冬天和夏天
正好颠倒过来。再过730年,才能回到原来的起点。公元前46年,罗马统帅儒略·凯撒
(又译朱利乌斯·凯撒)决定以埃及的太阳历为蓝本,重新编制历法。凯撒主持编制的历
法,被后人称为“儒略历”。
儒略历法对埃及太阳历中每年约四分之一天的误差,作了这样的调整:设平年和闰年,
平年365天,闰年366天。每4年置1个闰年。单月每月31天,双月中的2月平年2
9天,闰年30天,其它双月每月30天。
恺撒死后,他的继承人奥古斯都因为自己生在8月,便从2月中抽出一天加在8月上,
使8月也成为大月,即31天,同时相应把9、11两个月定为小月,10、12两个月定
为大月。经过这样的改动,各月的天数与今天使用的公历基本相同了。公元325年,罗马
皇帝君士坦丁在一次宗教会议上,规定儒略历为基督教的历法,但没有规定哪一年是它的起
点。到了公元6世纪时,基督教徒把500多年前基督教传说的创始人耶稣·基督诞生的那
一天,说成是公元元年。“公元”的拉丁文的意思就是“主的生年”,用拉丁文A.D.表
示。在这一年以前,称为“公元前”,英文的意思是“基督以前”,用英文B.C.表示。
儒略历虽然比埃及的太阳历进了一步,但回归年仍有11分14秒的误差,积128年
又要相差一天。儒略历在欧洲通行了1600多年,至16世纪下半叶,历法上的日期比回
归年迟了10天。比如,1583年的春分应在3月21日,历法上却是3月11日。此
外,教会规定耶稣复活节,应在过春分月圆后的第一个星期日,由于春分已相差10天之
多,耶稣究竟在哪一天“复活”的,也成了问题。因此,对儒略历作进一步的改革,已经势
在必行。
罗马教皇格里高利十三世,在1582年组织了一批天文学家,根据哥白尼日心说计算
出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤
销,继10月4日之后为10月15日,所以1533年的春分又复归于3月21日;过去
将4年置1个闰年,400年共计100个闰年,现在改为400年中有97个闰年,从而
大体上弥补了11分14秒的误差。置闰的方法是:凡是逢百年那一年可以用400除尽的
就是闰年,除不尽的就不是(如:1600年是年,1700年、1800年、1900年
皆不是年,2000年是闰年)。后来人们将这一新的历法称为“格里高利历”,也就是今
天世界上所通用的历法,简称格里历或公历。
*成立后,*人民*通令,中国以格里历为国家历法,并采用公元纪
年,但不废除农历。
当然,格里历也不是尽善尽美的,每月的天数仍然参差不齐,规则性不强,特别是每经
过三千几百年还会有一天的误差。随着生产的发展和天文学的进步,这些缺陷将不断得到改
进。
#31
上面的确错了,下面是正确的,($t%4>$y%4?$n+1:$n+0)这个比较巧妙,只要总数取4的模大于最后一个数取4的模肯定 能被4整除。
$y=9;$x=4;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($t%4>$y%4?$n+1:$n+0):$n+0;
echo $n;
写成函数就是
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
$n=$t%$j?($t%$j>$y%$j?$n+1:$n+0):$n+0;
return $n;}
都验证一下看对不对
$y=9;$x=4;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($t%4>$y%4?$n+1:$n+0):$n+0;
echo $n;
写成函数就是
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
$n=$t%$j?($t%$j>$y%$j?$n+1:$n+0):$n+0;
return $n;}
都验证一下看对不对
#32
$x=1900;
$y=2004;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($t%4>$y%4?$n+1:$n+0):$n+0;
echo $n;
结果为27
按闰年的约定,1900-2004间只有26个
你把1900也算作闰年了
$y=2004;
$t=($y-$x+1);
$n=intval($t/4);
$n=$t%4?($t%4>$y%4?$n+1:$n+0):$n+0;
echo $n;
结果为27
按闰年的约定,1900-2004间只有26个
你把1900也算作闰年了
#33
那个只是能被4整除的算法,下面是应该是最简单最搞笑计算闰年方法
$x=1;$y=1004;
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
$n=$t%$j?($t%$j>$y%$j?$n+1:$n+0):$n+0;
return $n;}
echo fun($x,$y,4)-fun($x,$y,100)+fun($x,$y,400);
$x=1;$y=1004;
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
$n=$t%$j?($t%$j>$y%$j?$n+1:$n+0):$n+0;
return $n;}
echo fun($x,$y,4)-fun($x,$y,100)+fun($x,$y,400);
#34
正确结果是486,好老的电脑
#35
上面那个运行时间:8.9000000000006E-005486秒
xuzuning(唠叨) 的运行时间是:0.015689秒
至于质数的算法,实在想不出更好好的。
不过能被4整除的肯定能被2整除
xuzuning(唠叨) 的运行时间是:0.015689秒
至于质数的算法,实在想不出更好好的。
不过能被4整除的肯定能被2整除
#36
ashchen(陈辉) :
嗯。你那个是很不错。要是我的的话就只能是(4-$first%4)%4<$years%4...555555555555
赫赫。归纳的彻底。赫赫。
xuzuning(唠叨) :大大不好意思哈,俺跑题了。讨论简化问题去了。
还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量???
嗯。你那个是很不错。要是我的的话就只能是(4-$first%4)%4<$years%4...555555555555
赫赫。归纳的彻底。赫赫。
xuzuning(唠叨) :大大不好意思哈,俺跑题了。讨论简化问题去了。
还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量???
#37
函数再简化一下,估计可以写到标准函数库里了,绝对高效率
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
if($t%$j && $t%$j>$y%$j) $n++;
return $n;}
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
if($t%$j && $t%$j>$y%$j) $n++;
return $n;}
#38
模2、模3、模5、模7、模11....
以2起步长为2构造n以内的素数表
2-n内的数查表
以2起步长为2构造n以内的素数表
2-n内的数查表
#39
xuzuning(唠叨) :
一次循环???
老大给具体讲讲吧
一次循环???
老大给具体讲讲吧