C语言,求2/1+3/2+5/3+8/5+…前20项之和,结果保留2位小数

 我来答
喃喃自语开心
2013-04-10 · TA获得超过388个赞
知道小有建树答主
回答量:545
采纳率:66%
帮助的人:140万
展开全部
#include <stdio.h>
int main()
{
int i;
int a=2,b=1,t;
float sum=0;
for(i=0;i<20;i++)
{
sum =sum+ (float)a/(b*1.00);
t=a;
a=a+b;
b=t;
}
printf("%.2f\n",sum);
}

答案 32.66
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
亥气R6
2019-12-23 · TA获得超过1554个赞
知道答主
回答量:167
采纳率:100%
帮助的人:3.9万
展开全部
求2/1+3/2+5/3+8/5+…前20项之和,结果保留2位小数,C语言代码如下:

#include "stdio.h"

void main(){

int a[21]={0};

double t=0,sum=0;

int i;

a[0]=1;

a[1]=2;

for(i=2;i<21;i++)

a[i]=a[i-1]+a[i-2];

for(i=0;i<20;i++){

t=a[i+1]*1.0/a[i];

sum+=t; }

printf("2/1+3/2+5/3+...前20项后为%.2lf\n",sum);}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
韦书祎zS
2020-03-09
知道答主
回答量:1
采纳率:0%
帮助的人:633
展开全部
#include <stdio.h>
main()
{
int a = 2, b = 1, i, t;
double s = 0;
for (i = 0; i < 20; i++)
{
s += (double)a/b;
t = a;
a = a+b;
b = t;
}
printf("%.2f\n", s);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_步尘
2018-03-31
知道答主
回答量:1
采纳率:0%
帮助的人:878
展开全部

按照上述算法,每一次计算分数的时候,都会有精度丢失

5/3=1.666666666666666666666...会按1.666667计算,其他同理,

所以,我们应该先将分母通分,然后将通分后的分子之和加起来,

例:(2/1+3/2+5/3)=>(12/6+9/6+10/6)=>31/6=>5.166667

所以,改良后的算法如下:

#include "stdio.h"

int main() {
    int arr[25],i=0;
    int minMultiple=1;// 分母的最小公倍数,作分母
    int molecule=0;// 同分母下,分子的和

    arr[0]=1;
    arr[1]=1;

    // 补全斐波拉契数列
    for(i=2; i<25; i++)
    arr[i]=arr[i-1]+arr[i-2];

    // 计算最小公倍数
    for(i=1; i<=21; i++) {
        if(minMultiple%i!=0)
        minMultiple=minMultiple*i/max(minMultiple,arr[i]);
    }

    // 计算分子的和
    for(i=1; i<=21; i++)
        molecule+=minMultiple/arr[i]*arr[i+1];

    printf("%lf",molecule*1.0/minMultiple);

    return 0;
}

// 求最大公约数
int max(int a,int b) {
    if(a%b==0)
        return b;
    max(b,a%b);
}

运行结果如下:

结果为34.203345,和32.66还是差距很大的, 

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
吼呣酱
2018-03-30
知道答主
回答量:1
采纳率:0%
帮助的人:879
展开全部

按照上述算法,每一次计算分数的时候,都会有精度丢失,

5/3=1.666666666666666666666...会按1.666667计算

其他同理,所以,我们应该先将分母通分,然后将通分后的分子之和加起来,例:

(2/1+3/2+5/3)=>(12/6+9/6+10/6)=>31/6=>5.166667

所以,改良后的算法如下:结果为34.203345,和32.66还是差距很大的,,

#include "stdio.h"

int main() {
int arr[25],i=0;
int minMultiple=1;// 分母的最小公倍数,作分母
int molecule=0;// 同分母下,分子的和

arr[0]=1;
arr[1]=1;

// 补全斐波拉契数列
for(i=2; i<25; i++)
arr[i]=arr[i-1]+arr[i-2];

// 计算最小公倍数
for(i=1; i<=21; i++) {
if(minMultiple%i!=0)
minMultiple=minMultiple*i/max(minMultiple,arr[i]);
}

// 计算分子的和
for(i=1; i<=21; i++)
molecule+=minMultiple/arr[i]*arr[i+1];

printf("%lf",molecule*1.0/minMultiple);

return 0;
}

// 求最大公约数
int max(int a,int b) {
if(a%b==0)
return b;
max(b,a%b);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式