| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 886 人关注过本帖
标题:两个无限序列的问题,感觉是不是做错了
只看楼主 加入收藏
ilsoviet1917
Rank: 2
等 级:论坛游民
帖 子:103
专家分:26
注 册:2010-5-11
结帖率:84.21%
收藏
 问题点数:0 回复次数:10 
两个无限序列的问题,感觉是不是做错了
先说一下题意
有两个无限序列:

1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ……
1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + ……

编写一个程序计算这两个序列不断变化的和,直到达到某个次数。尝试在20次、100次和500次后的总和,是否每个序列都看上去要收敛于某个值?

然后是我写的程序

程序代码:
#include <stdio.h>

double p_infini (double p);
double n_infini (double n);

double p_infini (double p)
{
    float h = 1.0;
    float i;
    double sum = 0;

    for (i = 2; i <= p; i++)
    {
        sum = sum + h / i;
    }

    return sum;
}

double n_infini (double n)
{
    float h = 1.0;
    float i;
    double sum = 0;

    for (i = 2; i <= n; i++)
    {
        sum = sum + (h / i) * -1.0;
    }

    return sum;
}

int main (void)
{
    double i;
    double p_sum, n_sum;

    printf ("Entez un numero:");
    scanf ("%lf", &i);

    p_sum = p_infini (i);
    n_sum = n_infini (i);

    printf ("values1        values2 \n");
    printf ("%.3lf        %.3lf \n", p_sum + 1.0, n_sum + 1.0);

    return 0;
}

20次:  3.598    -1.598
100次: 5.187    -3.187
500次: 6.793    -4.793

我没发现有要向某个值收敛的趋势啊,是不是我写错?还是我理解错题意了?



[ 本帖最后由 ilsoviet1917 于 2011-5-5 11:09 编辑 ]
2011-05-05 11:01
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:0 
是分别求每个式子的值,还是求这两个式子加起来或相减的值?
2011-05-05 11:22
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:0 
while(1)
{double i,sum1=0,sum2=0,j;
scanf("%lf",&j);
for(i=1.0;i<=j;i++)
sum1=sum1+1.0/i;
for(i=1;i<=j;i++)
{if((int)i%2==0)sum2=sum2-1.0/i;else sum2=sum2+1.0/i;}
printf("%lf,%lf,%lf,%lf\n",sum1,sum2,sum1-sum2,sum1-sum2);}
getch();
2011-05-05 11:23
ilsoviet1917
Rank: 2
等 级:论坛游民
帖 子:103
专家分:26
注 册:2010-5-11
收藏
得分:0 
2# 我觉得是分别求
3# 不让用if结构……


[ 本帖最后由 ilsoviet1917 于 2011-5-5 12:02 编辑 ]
2011-05-05 11:58
键盘农夫
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:88
专家分:106
注 册:2011-5-5
收藏
得分:0 
回复 4楼 ilsoviet1917
第一个数列叫调和级数
确实不收敛

《狂人C:程序员入门必备》
2011-05-05 20:44
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
你写的有问题
double n_infini (double n)
{
    float h = 1.0;
    float i;
    double sum = 0;

    for (i = 2; i <= n; i++)
    {
        sum = sum + (h / i) * -1.0;
    }

    return sum;
}

这里的(h/i)* -1.0始终为负,和题目不符了
要做一个if 判断,i 为偶时 (h/i)* -1.0 为负,i 为奇时其为负
2011-05-05 21:47
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
不让用if 的话就用pow(-1,i)
2011-05-05 21:49
ilsoviet1917
Rank: 2
等 级:论坛游民
帖 子:103
专家分:26
注 册:2010-5-11
收藏
得分:0 
回复 6楼 obstratiker
sum = sum + (h / i) * -1.0;

改成sum = (sum + (h / i))*-1.0

可对?


[ 本帖最后由 ilsoviet1917 于 2011-5-6 08:31 编辑 ]
2011-05-06 08:30
ilsoviet1917
Rank: 2
等 级:论坛游民
帖 子:103
专家分:26
注 册:2010-5-11
收藏
得分:0 
好像也不对,算偶数次的时候能算对,奇数次的时候答案就错误。

求修改方法

[ 本帖最后由 ilsoviet1917 于 2011-5-6 08:53 编辑 ]
2011-05-06 08:42
公子有毒
Rank: 1
等 级:新手上路
帖 子:7
专家分:8
注 册:2009-4-24
收藏
得分:0 
double n_infini (double n)
{
    float h = 1.0;
    float i;
    double sum = 0;
    int flag=-1;
    for (i = 2; i <= n; i++)
    {
        sum = sum + (h / i) * flag;
       flag=-flag;
    }

    return sum;
}
参考红色文字部分,增加一个符号控制的变量flag,初值为-1,循环体执行一次求其相反数变为1,循环体再执行一次变为相反数-1,如此交替。

[ 本帖最后由 公子有毒 于 2011-5-6 09:19 编辑 ]
2011-05-06 09:18
快速回复:两个无限序列的问题,感觉是不是做错了
数据加载中...
 
   



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

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