考考你:从第1年到2004年之间有多少个闰年 for($i=1;$i<=2004;$i++) if(date("L" , mktime(0,0,0,1,1,$i)) echo $i."是闰年";未经测试:D 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <?phpfunction 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年算起需要证明 嘿嘿shuzai被淘汰,1,循环2004次,效率不行,2,mktime有限制 the range of valid years includes only 1970 through 2038. xuzuning(唠叨)也被淘汰,循环次数的问题 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;} <?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;}?> /*** 函数名称: 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); 偶然兄也来啦?你这个好像也循环了$end-$start+1次啊 代码不写了,写个自然语言描述的伪代码吧~~~function getleap($start, $end){ 计算 $start 距它前一个润年有几年(3>= 结果1 >=0) 计算 $end 距它前一个润年有几年(3>= 结果2 >=0) getleap = $start - $end + 结果1 - 结果2 + 1}计算某年距它前一个润年有几年很简单吧?除出来的余数合适就合适~~~~ mikespook(谁说叫Mike的一定是狼?) 也不对啊,没考虑100和4001800年和1900年不是闰年,2000年是闰年 简化问题: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情形,得出共性。就得出上述方法了:)至于真正的闰年算法,赫赫,想想办法补上吧。(俺太懒) 判断两数之间有多少个能被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的整数 ashchen(陈辉) :你的错了,如果是x=4,y=9呢?有看我的么?我好像没有用循环吧?赫赫另外,求闰年时,考虑一下,是套用我那种方法好,还是你们的循环好,那种好就用那种3。目前你们写得好象计算量都很大。跟年限差关系很大哦用循环遍历是最好不要采用的办法再加个参数$n就可以求被$n整除得个数了还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量??? 上面的确错了,下面是正确的,($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;}都验证一下看对不对 $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也算作闰年了 那个只是能被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); 上面那个运行时间:8.9000000000006E-005486秒xuzuning(唠叨) 的运行时间是:0.015689秒至于质数的算法,实在想不出更好好的。不过能被4整除的肯定能被2整除 ashchen(陈辉) :嗯。你那个是很不错。要是我的的话就只能是(4-$first%4)%4<$years%4...555555555555赫赫。归纳的彻底。赫赫。 xuzuning(唠叨) :大大不好意思哈,俺跑题了。讨论简化问题去了。还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量??? 函数再简化一下,估计可以写到标准函数库里了,绝对高效率function fun($x,$y,$j){$t=($y-$x+1);$n=intval($t/$j);if($t%$j && $t%$j>$y%$j) $n++;return $n;} xuzuning(唠叨) :一次循环???老大给具体讲讲吧 PHP分页求助,有代码帮看一下.点击分页获取值失效了在线等....大大帮忙 php初学者测试 这种控制字段的代码插到网页里怎么不起做用 难道200分都没人要? 求一个thinkphp带图片修改的crud例子蛮 关于代码压缩的问题 cookie在本地有值,上传到服务器就没值啦?! xp下apache+mysql+php的默认页总是乱码怎么解决? 用PHP进行B/S开发时,如何将PHP和HTML完全分割? 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年算起需要证明
the range of valid years includes only 1970 through 2038.
$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;
}?>
* 函数名称: 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);
你这个好像也循环了$end-$start+1次啊
{
计算 $start 距它前一个润年有几年(3>= 结果1 >=0)
计算 $end 距它前一个润年有几年(3>= 结果2 >=0)
getleap = $start - $end + 结果1 - 结果2 + 1
}计算某年距它前一个润年有几年很简单吧?除出来的余数合适就合适~~~~
1800年和1900年不是闰年,2000年是闰年
问题分析:
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情形,得出共性。就得出上述方法了:)至于真正的闰年算法,赫赫,想想办法补上吧。(俺太懒)
$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的整数
你的错了,如果是x=4,y=9呢?
有看我的么?我好像没有用循环吧?赫赫
另外,求闰年时,考虑一下,是套用我那种方法好,还是你们的循环好,那种好就用那种3。
目前你们写得好象计算量都很大。跟年限差关系很大哦
用循环遍历是最好不要采用的办法再加个参数$n就可以求被$n整除得个数了还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量???
$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=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也算作闰年了
$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);
xuzuning(唠叨) 的运行时间是:0.015689秒至于质数的算法,实在想不出更好好的。
不过能被4整除的肯定能被2整除
嗯。你那个是很不错。要是我的的话就只能是(4-$first%4)%4<$years%4...555555555555
赫赫。归纳的彻底。赫赫。 xuzuning(唠叨) :大大不好意思哈,俺跑题了。讨论简化问题去了。还有,大家讨论下求素数有什么好办法?最基本的去除2以外的偶数检查。接下来还有什么方法可以减少计算量???
function fun($x,$y,$j)
{$t=($y-$x+1);
$n=intval($t/$j);
if($t%$j && $t%$j>$y%$j) $n++;
return $n;}
一次循环???
老大给具体讲讲吧