C语言,求2/1+3/2+5/3+8/5+…前20项之和,结果保留2位小数
11个回答
展开全部
#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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
求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);}
#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);}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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);
}
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);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
按照上述算法,每一次计算分数的时候,都会有精度丢失
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还是差距很大的,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
按照上述算法,每一次计算分数的时候,都会有精度丢失,
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);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询