注册 登录
编程论坛 C++教室

这个程序哪里出错了?

sunflower44 发布于 2011-08-27 16:57, 758 次点击
这道编程题的题目是:利用公式π/4=1-1/3+1/5-1/7…编程序求π值
下面是我写的程序:


#include<iostream.h>
void main()
{
    int i,j,k;float sum(0.0);
    for(i=1;(float)(1/i)>(0.000001);i++)
    {
        j=(i-1)%4;
        k=i%2;
            if(k)
            {
                if(j!=0)
                {
                    i=i*(-1);
                }
                sum+=float(1/i);
            }
    }
cout<<4*sum;
}


可是为什么结果是4呢?错哪里了?
14 回复
#2
pangding2011-08-27 17:35
这个程序是你自己写的还是在什么书上抄的呢?

错的地方挺多,比如里面有 i=i*(-1) 之类的,i 都能变成负值,还在 for 里 ++i 肯定是不对的。

还有比如像什么 1/i > 0.000001 这样的语句,两边一取出倒数,很容易就转成 i < 1000000 这样的语句,可以很好使表达式变简洁。

[ 本帖最后由 pangding 于 2011-8-27 18:00 编辑 ]
#3
Hujc712011-08-27 17:38
float sum(0.0);改成float sum=0.0;你这中间的算法也是错误的,给个简单的你j=1;for(i=1;j>(0.000001);i++)
  {  j=float(1/(2*i-1));
if(i%2==0)            j*=-1;sum+=j;
    }
#4
pangding2011-08-27 17:48
嗯。如果觉得那个负号不好处理,一次算两项也可以。像这样:
程序代码:

#include <iostream>
using namespace std;

int main()
{
  int i;
  double sum = 0.0;

  for (i = 1; i < 100000; i += 4) {
    sum += 1.0 / i;
    sum -= 1.0 / (i+2);
  }

  cout << 4 * sum << endl;

  return 0;
}

#5
sunflower442011-08-27 18:49
回复 2楼 pangding
我自己写的阿。。。本人编程菜鸟。。。
不过那个负号转化肯定是没错滴,我想问题是不是跟格式转化有关,int和float的问题。。。
#6
sunflower442011-08-27 18:55
回复 2楼 pangding
你能具体告诉我哪儿错了吗?另外为什么结果是4?
#7
sunflower442011-08-27 18:56
回复 3楼 Hujc71
中间算法哪里错了?能具体说说吗?还有为什么结果是4呢?
#8
Luminal2011-08-27 20:28
float(1/i)
1是int型,i也是int型,当i>1后,结果始终是1/i=0;
改成1.0/i 应该可以解决问题
#9
Hujc712011-08-27 20:37
i=i*(-1);这里的问题,你看看i是怎么变化的,你就知道你这里有问题!先i=1,i=2,i=3,i=-3,到这里循环就结束了!sum的结果是1-float(1/3)=1;所以你结果是4!你再看看!
#10
bfmiyt2011-08-27 20:51
路过围观。。。介是书上例题吧
#11
sunflower442011-08-27 21:55
回复 8楼 Luminal
不行。。解决不了,还是4
#12
sunflower442011-08-27 21:58
回复 9楼 Hujc71
程序代码:
#include<iostream.h>
void main()
{
    int i,j,k;float sum=0.0;
    for(i=1;(float)(1.0/i)>(0.000001);i++)
    {
        j=(i-1)%4;
        k=i%2;
            if(k)
            {
                if(j!=0)
                sum-=float(1/i);
                else sum+=float(1/i);
            }
    }
cout<<4*sum;
}
改成这样呢?
为什么结果还是4?
#13
pangding2011-08-27 22:54
你这个改的不彻底呀……
你只有 for 里的那个 (float)(1.0/i) 改了,其它的还是 float(1/i) 嘛…… 这样的话,全都是 0。
#14
Hujc712011-08-28 09:36
是啊,你改得不彻底,下面代码里面没有改,还有话说1.0/i就已经默认是实数了,应该不需要强制类型转换吧!
#15
czsbc2011-08-28 11:52
程序代码:
#include<iostream.h>

void main()
{
    int i,j,k,sign=1;float sum=0.0;
    for(i=1;(float)(1.0/i)>(0.000001);i++)
    {
        j=(i-1)%4;
        k=i%2;
            if(k)
            {
                if(j!=0)
                {
                    sign*=-1;
                }
                sum+=float(sign*1.0/i);
            }
        sign=1;
    }
    cout<<4*sum;
}
按照LZ想法,可以再加一个变量保存符号就OK了.
1