| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2510 人关注过本帖, 1 人收藏
标题:小猴喜欢吃桃,吃法有点怪,第一天吃1个,以后每天吃的数量比前一天吃的数多 ...
取消只看楼主 加入收藏
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
结帖率:84.38%
收藏(1)
已结贴  问题点数:20 回复次数:7 
小猴喜欢吃桃,吃法有点怪,第一天吃1个,以后每天吃的数量比前一天吃的数多2个
这是论坛里一童鞋的问题,我自己做的,不知道哪里有问题。高手些多多指教一下,反正就是不对。那位同学已经结贴了,所以我这里开帖,多多指点一下
#include"stdio.h"
int main(){
int n,day=0,k=2;
printf("input the tao zi number:");
scanf("%d",&n);
while((n=n-k)!=0)
{k=k+2;
day++;}
printf("%d",day);}
搜索更多相关主题的帖子: 童鞋 include number 
2011-12-20 22:49
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
他的原题:c小问题求教
小猴喜5欢吃桃,吃法有点怪,第一天吃1个,以后每天吃的数量比前一天吃的数多2个,现有n个桃,问至少要吃多少天才能吃完。
第一行输入:n

认为事物非黑即白是缺智慧的表现……
2011-12-20 22:49
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
我嚓,论坛里的同学不要那啥,不吝赐教嘛。

认为事物非黑即白是缺智慧的表现……
2011-12-20 22:55
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
以下是引用beyondyf在2011-12-20 22:57:31的发言:

呵呵,你多大了?
很大了,反正。因为是自己看书,所以就找些题来练练

认为事物非黑即白是缺智慧的表现……
2011-12-20 23:09
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
#include"stdio.h"
int main(){
int n,day=0,k=2;
printf("input the tao zi number:");
scanf("%d",&n);
while((n=n-k)>=0)
{k=k+2;
day++;}
day=day+1;
printf("%d",day);}

OK了。不过只能针对偶数,如果是奇数的话,再增加一个判断,再在最后day那里再加一个1.
这里day最后加1,是因为最开始赋值就是0,比如如果只是2个,那么输出还是0天,所以就加了一个1

认为事物非黑即白是缺智慧的表现……
2011-12-20 23:13
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
以下是引用xuxiong517在2011-12-20 23:01:56的发言:

改为while((n=n-k)>=0)。。
嗯,说的很对,谢谢你,呵呵

[ 本帖最后由 a271885843 于 2011-12-20 23:17 编辑 ]

认为事物非黑即白是缺智慧的表现……
2011-12-20 23:13
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
以下是引用有容就大在2011-12-20 23:36:23的发言:

k = 2 改成 k = 1.
while((n=n-k)>=0) 改成 while((n=n-k)>=1)。
这样改只能对一部分,你的算法有漏洞。知道n 你为什么要从第一天吃的桃子数开始减?
这个是我写的你看下:
#include
int main(void)
{
    while (888)
    {
      int n, i, flag = 1;
      int day = 0, k = 0, sum = 0;

      printf("请输入桃子数:");
      scanf("%d", &n);
      for(i = 1; flag; i++)
      {
        k = i * 2 - 1;     // 第i天吃掉的桃子数
        day++;      // 记录这是第几天
        sum += k;   // 从第1天到第i天一共吃掉的桃子数
        if (sum >= n)
            flag = 0;  // 桃子吃光光, 就在今天
        else
            flag = 1;  // 还有桃子,明天继续吃
      }
      printf("经过%d天,猴子就干光了桃子.\n", day);
    }
    return 0;
}
嗯。比我的强多了,呵呵。其他的都看懂了,为什么k=i*2-1呢?

认为事物非黑即白是缺智慧的表现……
2011-12-20 23:53
a271885843
Rank: 2
等 级:论坛游民
帖 子:291
专家分:58
注 册:2011-11-24
收藏
得分:0 
以下是引用beyondyf在2011-12-21 08:43:11的发言:

呵呵,楼主别介意我的问题。知道你多大我才好判断该从哪个角度和你探讨。
关于你们在使用的模拟问题过程的算法,我不多说什么了,都在把简单的问题往复杂里做。给一个示例对自己比一下。#include
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 20:14
快速回复:小猴喜欢吃桃,吃法有点怪,第一天吃1个,以后每天吃的数量比前一天吃 ...
数据加载中...
 
   



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

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