求调和级数SUM = 1/1 + 1/2 + 1/3 + ... 1/n 前n项和,输出形式为最简分数
例n=5时 SUM=137/60
推理知:
分子的可以写成 [[(1*2)+1]*3......]*n + (n-1)
分母则是n的阶乘n!
由此解题思路是:
1. 按照以上公式分别推出分子分母
2. 辗转相除法求最大公约数进行化简
代码如下(C):
//调和级数
//辗转相除法求最大公约数
int gcd(int n,int m){
if(m>n) swap(n,m);
int temp = 0;
while((temp = n%m)){
n = m;
m = temp;
}
return m;
}
//递归法改进辗转相除
int gcd(int n,int m){
if(m == 0)
return n;
gcd(m,n%m);
}
//通项求分子分母
int col(int n){
int fz = 1,fm=1,lc = 1;
if( n > 1){
for(int i = 2;i<=n;i++){
fz = fz * i + lc;
fm *= i;
lc*=i;
}
int g = gcd(fz,fm);
fz /= g;fm /= g;
printf("%d/%d",fz,fm);
}
else{
printf("1");
}
}
int main(){
int n=0;
while(scanf("%d",&n)!=EOF){
col(n);
}
}
测试结果: