C语言每日一练——第86天:出售金鱼问题

24 篇文章 0 订阅

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值