C语言每日一练
2022年3月12日
文章目录
题目描述
小明将养的一缸金鱼分5次出售:第1次卖出全部的一半加1/2条;第2次卖出余下的三分之一加1/3条;第3次卖出余下的四分之一加1/4条;第4次卖出余下的五分之一加1/5条;最后卖出余下的11条。试编程求出原来鱼缸中共有多少条鱼。
问题分析
假设当前金鱼数为y
,上一次卖鱼之前金鱼数为x
,卖鱼次数为i
(从1开始);根据题目,可以得到下面这个公式:
即
这是一个多项式,需要求出最开始的x
的值,使得公式运算到第4次时y=11
,在编程上,我们可以用穷举法,穷举第一次的x
值)。
代码实现
#include <stdio.h>
int main()
{
int sum = 0; //总金鱼数
int i = 0;
int flag = 0;
double tmp = 0;
for(sum = 11; sum <= 1000; sum++) //穷举范围11~1000
{
tmp = (double)sum;
for(i = 1; i <= 4; i++)
{
tmp = tmp - (tmp + 1) / (i + 1);
}
if(tmp < 11.000001 && tmp > 10.999999) //最后剩下11条(浮点数判断需要考虑精度问题)
{
flag = 1; //找到匹配的结果
break;
}
}
if(flag)
printf("金鱼总数为%d
", sum);
else
printf("error
");
return 0;
}
运行结果
网上参考
原文链接:http://c.biancheng.net/cpp/html/3317.html
原文部分思路(优化部分)
#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条金鱼。
", i);
flag = 1; /*求出结果,flag置1,退出试探*/
}
}
return 0;
}