| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2510 人关注过本帖, 1 人收藏
标题:小猴喜欢吃桃,吃法有点怪,第一天吃1个,以后每天吃的数量比前一天吃的数多 ...
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 10楼 a271885843

k = i * 2 - 1;     // 第i天吃掉的桃子数
第1天吃掉的桃子数是k = 1个呢, i=1时 ,2乘以i减去1才等于1.


[ 本帖最后由 有容就大 于 2011-12-21 00:49 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2011-12-21 00:43
天天涯涯
Rank: 4
等 级:业余侠客
帖 子:215
专家分:267
注 册:2011-10-17
收藏
得分:2 
回复 11楼 有容就大
你看一下,每天吃的桃有啥规律,第一天吃1个,第二天吃3,第三天吃5个,依此类推会发现天数i和桃子数目的关系,相当于在天数和桃子之间建立了一个数列。
2011-12-21 06:53
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,楼主别介意我的问题。知道你多大我才好判断该从哪个角度和你探讨。
关于你们在使用的模拟问题过程的算法,我不多说什么了,都在把简单的问题往复杂里做。给一个示例对自己比一下。
程序代码:
#include<stdio.h>
int main()
{
    int n, day, k;
    printf("Input the number of peaches: ");
    scanf("%d", &n);
    for(k = 1, day = 0; n > 0; day++)
    {
        n -= k;
        k += 2;
    }
    printf("%d\n", day);
    return 0;
}
现在主要说说这题的数学规律。我忘了什么时候学的等差数列了,初中还是高中?
这题的描述简直就是一个等差数列的定义。只不过现在是已知了前N项和,就项数N而已。
还记得上一贴最后小曹提到的那个公式吗?现在带各位温习一下知识了。

等差数列
第一项为 a1 = 1;
项差为 d = 2;
前N项和为 s = (a1 + a1 + d * (n - 1)) * n / 2 = n * n;

所以 n = sqrt(s)。这里的s就是题中的n,这里的n则是题中的day。
sqrt(s)很多时候不是整数,而是一个小数。这个小数的意义是什么呢?它表示最后剩下的桃子不足以吃一顿,但毕竟也不是前一天能吃完的。
所以最后的结果要对n进行上取整。上一贴中小蔡最后的问题,ceil就是一个上取整函数(准确的说是返回不小于参数的最小整数,在参数为负数时注意这一定义)。

应用这一规律的算法将只有一行代码,效率的差别就不用我说了吧。

重剑无锋,大巧不工
2011-12-21 08:43
z364172655
Rank: 2
等 级:论坛游民
帖 子:22
专家分:38
注 册:2011-12-8
收藏
得分:2 
以下是引用a271885843在2011-12-20 23:53:41的发言:

嗯。比我的强多了,呵呵。其他的都看懂了,为什么k=i*2-1呢?
第一天吃了1个,第二天吃了3个,以后每天都比前一天多吃2个,可知其规律为:则有K=2*I-1,I>=1;
2011-12-21 08:55
梦ambious
Rank: 2
等 级:论坛游民
帖 子:27
专家分:71
注 册:2011-11-25
收藏
得分:2 
我没学过C,就用C++编了一个,希望能用的着!
#include<iostream>
using namespace std;
int main()
{
    int n,day=1,eat=0;
    cout<<"number"<<endl;
    cin>>n;
    while(true)
    {
        eat+=2*day-1;
        if(eat>=n)
        {
            cout<<"need "<<day<<" days"<<endl;
            system("pause");
        }
        else
            day++;
    }
    return 0;
}
2011-12-21 09:46
xuxiong517
Rank: 2
等 级:论坛游民
帖 子:35
专家分:29
注 册:2011-11-1
收藏
得分:0 
以下是引用a271885843在2011-12-20 23:53:41的发言:

嗯。比我的强多了,呵呵。其他的都看懂了,为什么k=i*2-1呢?
他的方法好,用k=i*2-1,求每天吃的桃子数
2011-12-21 12:36
小狂人1
Rank: 2
等 级:论坛游民
帖 子:8
专家分:15
注 册:2011-7-1
收藏
得分:2 
等差数列。。。
2011-12-21 14:28
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
如果省去过程,重点运用数学的方式解决,当然程序会很简短,只是程序难以读懂。
下面这个也一样:
#include <stdio.h>
int  main(void)
{
    int i, n, day = 1;
 
    printf("Please input n:");
    scanf("%d", &n);
    for (i = 1; n - i * i > 0; i++, day++)
        ;         // 用个空语句就解决了。 但是算法没有清晰的表达出来。
    printf("%d\n", day);
    return 0;
}

调用库函数就是下面这个:
#include <stdio.h>
#include <math.h>
int  main(void)
{
    int n;
 
    printf("Please input n:");
    scanf("%d", &n);
    printf("%d\n",(int)ceil(sqrt(n)));
    return 0;
}

[ 本帖最后由 有容就大 于 2011-12-21 15:03 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2011-12-21 14:38
haha02388453
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2011-12-21
收藏
得分:2 
真心难    初学者的我看不懂
2011-12-21 14:52
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 19楼 haha02388453
初学就从简单的来,一步一步的走,慢慢就好了。

梅尚程荀
马谭杨奚







                                                       
2011-12-21 14:57
快速回复:小猴喜欢吃桃,吃法有点怪,第一天吃1个,以后每天吃的数量比前一天吃 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.103344 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved