august 发表于 2007-12-20 11:40:22

算法題

出售金鱼者决定将缸里的金鱼分五次全部卖出:第一次卖出全部金鱼的一半加
      二分之一条金鱼;第二次卖出剩余金鱼的三分之一加三分之一条金鱼;第三次
      卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五公之一
      加五分之一条金鱼。现在还剩下11条金鱼,当然出售金鱼时不能切开或者有任
      何破损的,问这鱼缸里原有多少条金鱼?(出售金鱼.c)
      (答案:鱼缸里原有59条金鱼。)

main()
{
         int m,i=1,j,n=13;
         for (m=13;(n!=11)||(i<=4);m+=2)
       /*变量m为原有金鱼的数量,n为卖完i次之后所剩金鱼的数量。只有n=11并且i>4
         才退出该循环。*/
       {
               n=m;
               for (i=1;i<=4;i++)       /*模拟前四次卖金鱼的过程*/
               {
                        if (n%(i+1)==i)      /*符合要求就继续*/
      n=n*i/(i+1);
         else break;          /*否则就重新取值*/
               }
      }
   printf("鱼缸里原有%d条金鱼。",m-2);
}

我想問的是
if (n%(i+1)==i)      /*符合要求就继续*/
n=n*i/(i+1);
   else break;   
這段代碼到底是根據什麼判斷呢?還有按牠這樣的話,m-2, 那就是求得 n=m=61, 將n=61代主下面的似乎第二次循環就不符合了,怎麼這樣呢?

lw 发表于 2007-12-20 20:03:28

其实偶题目就没有理解…… 什么叫做一半有1/2条??

lxhbs 发表于 2007-12-20 21:07:29

不能切开,又卖1/2条。。。理解不能。
还有就是定义了j,但是有没有使用j,囧。。

Zelsazgh 发表于 2007-12-20 23:55:16

按照中学计算机奥赛的要求的话,完全可以使用公式求解,没必要这么麻烦,同上,N分之一条金鱼理解不能

夜无边 发表于 2007-12-21 00:02:51

很简单,因为那堆金鱼是单数,比如三条吧,一半就是1。5
那一半再加1/2条就是两条了

silverbird 发表于 2007-12-22 10:58:42

占某专业版里说一非专业的话,希望bz不要介意,内容是:

            小夜啊 跪求你教我数学好不?泪扑,死拽小夜不放.....

子陵~ 发表于 2008-2-10 17:13:42

晕 很晕 太晕……
这个题能不能用下递归?

霸全勋章 发表于 2008-2-10 20:17:46

破程序写的真烂。。一点可读性都没有。。。


if (n%(i+1)==i)      /*符合要求就继续*/
这句判断,就是判断(n/2+1/2)或(n/3+1/3)等。。是不是整数
假设说n/(i+1)=s余i,那么正常的商应该是s+i/(i+1),s是整数部分,i/(i+1)是小数部分
那么s+i/(i+1)+1/(i+1)就等于s+1,也就是小数部分不存在了,也就是整数


n=n*i/(i+1);
这句求的是剩余的鱼....
要注意的是,由于而整除的关系,n*i/(i+1)并不等于n-n/(i+1)...
而是等于n-n/(i+1)-1



還有按牠這樣的話,m-2, 那就是求得 n=m=61, 將n=61代主下面的似乎第二次循環就不符合了,怎麼這樣呢?
至于这里,要解释一下循环...
循环体结束一次后,循环变量做步长变化,这里是+=2
而判断是否循环则是在循环开头判断
所以当m=59时,n=59,经过循环体后,n=11,循环结束
然后m步长+2,变成61,再去循环头判断是否循环,n=11,不进行循环,跳出循环,此时m为61
然后printf 61-2=59
页: [1]
查看完整版本: 算法題