分数求和
题目描述
S=1/2+1/6+1/12+1/20+1/30+1/42+… 求数列前n项和,答案保留2位小数
输入格式
整数n
输出格式
一个浮点数.
样例输入
10
样例输出
0.91
我定睛一看
这道题需要判断多个数的最小公倍数
一定需要辗转相除法
也就是
欧几里得算法
详细解释如下:
来源: 我的第一本算法书
咳咳咳
我们会发现
这是求最大公约数的
今天我们就不悲伤了
咳咳咳
当然
最大公约数
最小公倍数
之间就差了个 约 和 倍
所以
我不会写
逗死我了
咳咳咳
转回话题
其实就正常写就OK了
我也是借鉴了别人的
圣旨到
int x(int a,int b)
{
int c;
while(b)//欧几里得算法
{
c=a;
a=b;
b=c%b;
}
return a;
}
皇上驾到
#include <bits/stdc++.h>
using namespace std;
int arr[11];
int x(int a,int b)
{
int c;
while(b)//欧几里得算法
{
c=a;
a=b;
b=c%b;
}
return a;
}
int main()
{
int n,t=2,a[105],o[105],b[105];
cin>>n;
a[1]=2;
for(int i=2;i<=n;i++)//求等差数列 fen
{
t+=2;
a[i]=a[i-1]+t;
}
for(int i=1;i<=n;i++) b[i]=a[i];
for(int i=1;i<=n;i++) if(i!=1) a[i]=a[i-1]/x(a[i-1],a[i])*a[i];//求最大公约数
t=0;
for(int i=1;i<=n;i++)//求分子
{
o[i]=a[n]/b[i];
t+=o[i];
}
double k=t/(double(a[n]));
cout<<fixed<<setprecision(2)<<k;//保留两位小数
}