标题:有一个代码看不懂。朋友给我发的,但我看不懂啊
只看楼主
jinggengchen
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-11-13
结帖率:50%
已结贴  问题点数:20 回复次数:8 
有一个代码看不懂。朋友给我发的,但我看不懂啊
#include <stdio.h>
int main(void)
{
    int i;
    double sum=0,tmp;
    for(i=1;(tmp=1/(double)i)>=1e-6;i+=2)
    {
        if((i+1)/2%2==0)
        tmp=-tmp;
        sum+=tmp;
    }
    printf("%.10lf\n",sum*4);
    return 0;
}
 计算π,计算公式是π/4 = 1-1/3+1/5-1/7……,直到最后一项的绝对值小于10的负6次方为止
搜索更多相关主题的帖子: 代码 int double sum tmp 
2017-11-17 09:42
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:4 
这样好看点:
#include <stdio.h>
int main(void)
{
    int i, k=1;
    double sum=0,tmp;
    for(i=1; (tmp=1.0/i)>=0.000001; i+=2,k*=-1)
        sum += k*tmp;
    printf("%.10lf\n",sum*4);
    return 0;
}
2017-11-17 10:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:4 
是 数学 不懂,还是 C 不懂?
#include <stdio.h>
int main( void )
{
    double pi_4 = 0;
    for( int i=1; i<1000000; i+=2 )
        pi_4 -= 1.0/i * (i%4-2);
    printf( "%f\n", pi_4*4 );
}
2017-11-17 11:01
小青345
Rank: 2
等 级:论坛游民
帖 子:64
专家分:15
注 册:2017-8-24
得分:4 
是 数学 不懂,还是 C 不懂?
#include <stdio.h>
int main( void )
{
    double pi_4 = 0;
    for( int i=1; i<1000000; i+=2 )
        pi_4 -= 1.0/i * (i%4-2);
    printf( "%f\n", pi_4*4 );
}

买房租房上爱心房产网
2017-11-17 14:53
jinggengchen
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-11-13
得分:0 
回复 3楼 rjsp
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pi_4 -= 1.0/i * (i%4-2);   
好吧 数学不懂,,,
2017-11-17 19:31
jinggengchen
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-11-13
得分:0 
回复 2楼 吹水佬
for(i=1; (tmp=1.0/i)>=0.000001; i+=2,k*=-1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum += k*tmp;
你的  这一步能否讲解一下 ,谢谢。
2017-11-17 19:33
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:4 
以下是引用jinggengchen在2017-11-17 19:33:32的发言:

for(i=1; (tmp=1.0/i)>=0.000001; i+=2,k*=-1)
        sum += k*tmp;
你的  这一步能否讲解一下 ,谢谢。

(tmp=1.0/i)>=0.000001  循环次数
 i+=2分母为1 3 5 7 ,。。
k*=-1  + - 来回变换
sum += k*tmp;  sum=sum+k*tmp
2017-11-19 21:49
Alien_Lee
Rank: 8Rank: 8
来 自:Linux帝国
等 级:蝙蝠侠
威 望:7
帖 子:149
专家分:739
注 册:2016-7-19
得分:4 
这个问题主要是两个点,第一个是每一项的分母,第二个是每一项的符号。剩下的就是迭加的问题,想必判断条件你肯定是懂的,也就是说最后一项满足绝对值小于10的负6次方。
分母:1,3,5,7,。。
奇数,所以是for(i=1;条件;i+=2),如果这样你还不知道,只能说你不适合C;
符号:+,-,+,-,
把符号看成系数+1,-1,+1,-1,那么,假如说第n个是x,那么后一个是不是就是 -1*x,所以说k=k*(-1);
if((i+1)/2%2==0)这个判断,其实也是在处理符号问题,理解为奇数项为+,偶数项为-。(i+1)/2是在计算奇数数列(1,3,5,7...)项数。


  DEBUG的过程就是进步的过程,每一个小错误都是大问题!...
2017-11-20 17:18
新人学习
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:145
专家分:187
注 册:2017-10-26
得分:4 
#include <stdio.h>
int main(void)
{
    int i;
    double sum=0,tmp;
    for(i=1;(tmp=1/(double)i)>=1e-6;i+=2)
    {
      
        tmp=-1*tmp;
        sum+=tmp;
    }
    printf("%.10lf\n",sum*4);
    return 0;
}
2017-11-20 21:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-482568-1-1.html




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

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