7-15 计算圆周率 (15分)

根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
如图

输入格式:
输入在一行中给出小于1的阈值。

输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。

输入样例:
0.01
输出样例:
3.132157

错误代码:

#include <iostream>
using namespace std;
int main()
{
    double pai = 0;
    double x;//作为阀值
    cin>>x;
    int i=1;
    double project;
   // int j=1;
    int product = 1;//两个int类型相除是不会有结果的
    int product2 = 1;
    while(true)
    {
        product = product*i;
        product2 = product2*(2*(i-1)+1);
        project = product/product2;
        if(project<x)
        {
            break;
        }
        pai += project;
        i++;
    }
    printf("%lf",pai);
}

问题分析:

  • 将product,product2全部声明为int型,这是错误的,当两者相除小于1时,赋值给project的值为0
  • 注意题目的公式是π/2,所以结果还需要×2
  • 仍然没有看清公式,公式分子的第一项是0!,第二项是1!,而代码中第二项处理成2!

修改
针对以上问题我对代码进行了修正

#include <iostream>
using namespace std;
int main()
{
    double pai = 0;
    double x;//作为阀值
    cin>>x;
    int i=0;
    double project;
   // int j=1;
    double product = 1;
    int product2 = 1;
    while(true)
    {
        product = product*i;
        if(i==0)
        {
        	product = 1;
		}
        product2 = product2*(2*i+1);
        project = product/product2;
        pai += project;
        if(project<x)
        {
            break;
        }
     //   pai += project;
        i++;
    }
    printf("%lf",pai*2);
}

这里需要注意两个问题:

  1. 当项小于阈值时,该项仍然需要相加
  2. 提交时,会直接提示直接计算n!会超长整型,说明系统不希望直接计算n!,可以将分子和分母之商作为一个变量,将此变量累加

正确代码:

#include <iostream>
using namespace std;
int main()
{
    double pai = 0;
    double x;//作为阀值
    cin>>x;
    int i=0;
   // double project = 1;
   // int j=1;
    double n = 1;
    while(n>=x)
    { 
        n = n*i/(2*i+1);
        //pai += n*i/(2*i+1);
        if(i==0)
        {
            n = 1;
        }
        pai += n;
        i++;
    }
    printf("%.6lf",pai*2);
}

总结:

  1. 程序员不需要视力.jpg
  2. 当结果为小数时,声明变量类型不能盲目int
  3. 当需要间接计算很大的数时,直接将结果作为一项
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值