小明将养的一缸金鱼分5次出售:第1次卖出全部的一半加1/2条;第2次卖出余下的三分之一加1/3条;第3次卖出余下的四分之一加1/4条;第4次卖出余下的五分之一加1/5条;最后卖出余下的11条。试编程求出原来鱼缸中共有多少条鱼。
金鱼是分5次出售的,每次卖出的方式都相同,因此可以用表达式将每次卖鱼后剩下的条数计算出来。因为:
由此可以推出:第 j 次卖出余下的 (j+1) 分之一加 1/(j+1) 条。假设第 j 次卖鱼前金鱼总数为 x,则第 j 次卖鱼后鱼缸中还剩下金鱼的条数为:x - (x+1) / (j+1)。
又由于“最后卖出余下的11条”,因此第 4 次卖鱼后鱼缸中剩下的金鱼条数为11条。因为金鱼只能整条进行出售,因此 x+1 必然能够整除 y+1。
x 的取值可以从 23 开始试探,由于 x 值必为奇数,因此步长取 2。
循环结构计算 x 可取的值,直到运行第 5 次并且 x=11 时停止,输出没有卖鱼时金鱼总数。
下面是完整的代码:
#include<stdio.h>
int main()
{
int i, j, x, flag=0; /*flag作为控制标志*/
/*从23开始试探,步长为2*/
for( i=23; flag==0; i+=2 )
{
for( j=1,x=i; j<=4&&x>=11; j++ )
if( (x+1) % (j+1) == 0) /*判断x+1是否能整除j+1*/
x -= (x+1) / (j+1);
else
{
x=0;
break;
}
if(j==5 && x==11)
{
printf("原来鱼缸中共有%d条金鱼。\n", i);
flag = 1; /*求出结果,flag置1,退出试探*/
}
}
return 0;
}
运行结果:原来鱼缸中共有59条金鱼。