C语言出售金鱼问题
问题描述
小明将养的一缸金鱼分5次出售:第1次卖出全部的一半加1/2条;第2次卖出余下的三分之一加1/3条;第3次卖出余下的四分之一加1/4条;第4次卖出余下的五分之一加1/5条;最后卖出余下的11条。试编程求出原来鱼缸中共有多少条鱼。问题分析
金鱼是分5次出售的,每次卖出的方式都相同,因此可以用表达式将每次卖鱼后剩下的条数计算出来。因为:- 第1次卖出全部的一半加1/2条;
- 第2次卖出余下的三分之一加1/3条;
- 第3次卖出余下的四分之一加1/4条;
- 第4次卖出余下的五分之一加1/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条金鱼。